を使用して、最後の文字が改行である場合にのみ置換を実行する方法を探しています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