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
それは好みの問題です。
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
あなたが投稿した(壊れた)コードスニペットから、あなたも改行を置き換えたいようです。その場合、それ自体で正規表現アンカーを使用しても役に立ちません。以下は解決策です:
sed '/[[:alpha:]]\+$/{N;s/[[:alpha:]]\+\n/replace/}' your_file
故障:
/[a-zA-Z]\+$/{}
は、カーリーの内側にあるものをすべて、正規表現に一致する行に適用することを意味します。N
は「次の行をアクティブなバッファーに追加する」(sed
が「パターンスペース」と呼ぶもの)を意味しますs///
ステートメントは、必要な置換です。これで、パターンスペースに2つの連続した行が含まれ、改行がその一部になるため、機能します。