sedを使用して行末を検出する方法

sedを使用して行末を検出する方法

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

たとえば、

lettersAtEndOfLine

交換しましたが、これは以下ではありません。

lettersWithCharacterAfter&

改行文字をうまく処理できないため、sed次のようには機能しません。

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

これはどのように達成できますか?

答え1

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

正規表現は次のとおりです。固定行末$(または行の先頭^)に使用します。行の先頭/末尾に式を固定すると、行のどこにでも正確に一致します。

[A-Za-z]*行末のパターンに一致する項目を別の項目に置き換えるには、次のようにパターンを固定します。

[A-Za-z]*$

...他の場所ではなく、行の末尾に一致するように強制します。

しかし[A-Za-z]*$それも一致するから何もない(たとえば、最後に現れる空の文字列は、すべてライン)、強制的に一致させる必要があります。たとえば、

[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

それは味の問題です。

答え2

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

または、長くて複雑で不要な方法は次のとおりです。

私はこれがtrの助けを借りてまだsedを使用して実行できることを発見しました。行の終わりを表す他の文字を指定できます。別の一時文字を使用する必要があります(この場合は `` ")。行の終わりを示すために「〜」を使用します。

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

答え3

投稿した(壊れた)コードの部分を見ると、改行文字も置き換えたいと思います。この場合、正規表現の固定自体は役に立ちません。解決策は次のとおりです。

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

分割:

  • /[a-zA-Z]\+$/{}中かっこ内の内容を正規表現に一致する行に適用することを意味します。
  • 正規表現は、次のように固定された正規表現を使用します。あなただけの答え、取るように修正Glen Jackmanによるコメント考えると。
  • 中括弧内は、N「アクティブバッファに次の行を追加する」(sed「パターン空間」と呼ばれる)を意味します。
  • 最後に、このs///ステートメントは必要な代替ステートメントです。パターン空間に2つの連続した行が含まれているので、これは機能し、改行文字もパターン空間の一部です。

答え4

行の終わりを見つけるには、次のようにします。$シンボル:

行末アンカーなし:

sed -n '/pattern/p' file 

行末アンカーを使用します。

sed -n '/pattern$/p' file

関連情報