web-dev-qa-db-ja.com

sedで行末を検出する方法

sedを使用して、最後の文字が改行の場合にのみ置換を実行する方法を探しています。

例えば:

lettersAtEndOfLine

は置き換えられますが、これは次のとおりではありません。

lettersWithCharacterAfter&

sedは改行ではうまく機能しないため、次のように単純ではありません。

$ sed -E "s/[a-zA-Z]*\n/replace/" file.txt

どうすればこれを達成できますか?

標準のsedを使用すると、neverファイルから読み取ったテキストに改行が表示されます。これは、sedが1行ずつ読み取るため、sedのパターンスペースの現在の行のテキストの最後に改行がないためです。つまり、sedは改行で区切られたデータを読み取り、区切り文字はsedスクリプトが認識する内容の一部ではありません。

正規表現は、行の終わりに$を使用してanchoredとすることができます(または^を使用して先頭に)。行の最初/最後に式をアンカーすると、行のどこかだけでなく、そこに正確に一致するように強制されます。

行末のパターン[A-Za-z]*に一致するものを何かで置き換える場合は、次のようにパターンを固定します。

[A-Za-z]*$

...行の最後で一致し、他の場所では一致しません。

ただし、[A-Za-z]*$nothingとも一致するため(たとえば、every行の最後にある空の文字列)、強制的に-を一致させる必要があります何か、例えば指定して

[A-Za-z][A-Za-z]*$

または

[A-Za-z]\{1,\}$

したがって、あなたのsedコマンドラインはこのようになります

$ sed 's/[A-Za-z]\{1,\}$/replace/' file.txt

-Eスイッチは必要ないため、ここでは使用しませんでした。それで、あなたは書くことができたでしょう

$ sed -E 's/[A-Za-z]+$/replace/' file.txt

それは好みの問題です。

21
Kusalananda
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt

または、長く複雑な不要な方法:

私は知っています、これはまだsedを使って、trの助けを借りて行うことができます。行の終わりを表す別の文字を割り当てることができます。別の一時的な文字、この場合は「 `」を使用する必要があります。行の終わりを表すために "〜"を使いましょう:

tr '\n' '`' <input.txt >output.txt
sed -i "s/`/~`/" output.txt
tr '`' '\n' <output.txt >result.txt

そして、実際の検索と置換を実行するには、「\ n」ではなく「〜」を使用します。

sed -i -E "s/[a-zA-Z]*~/replace/" result.txt

次に、他の行の余分な文字をクリーンアップします。

sed -i "s/~//" result.txt

明らかに、これはすべて一緒にパイプ処理でき、次のような結果になります。

tr '\n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' '\n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt

行の終わりを見つけるには、$-signを使用します:

行末アンカーなし:

sed -n '/pattern/p' file 

行末アンカーなし:

sed -n '/pattern$/p' file
0
user unknown

あなたが投稿した(壊れた)コードスニペットから、あなたも改行を置き換えたいようです。その場合、それ自体で正規表現アンカーを使用しても役に立ちません。以下は解決策です:

sed '/[[:alpha:]]\+$/{N;s/[[:alpha:]]\+\n/replace/}' your_file

故障:

  • /[a-zA-Z]\+$/{}は、カーリーの内側にあるものをすべて、正規表現に一致する行に適用することを意味します。
  • 正規表現は 自分の答え にあるアンカーを使用するもので、 glenn jackmanのコメント を考慮に入れるように変更されています。
  • カーリーの中では、Nは「次の行をアクティブなバッファーに追加する」(sedが「パターンスペース」と呼ぶもの)を意味します
  • 最後にs///ステートメントは、必要な置換です。これで、パターンスペースに2つの連続した行が含まれ、改行がその一部になるため、機能します。
0
Joseph R.