その特定の行の改行を削除しながら、行全体を置き換えます。

その特定の行の改行を削除しながら、行全体を置き換えます。

sed特定の単語を含む行全体を置き換えようとしています。そして最後に改行文字があります。テストファイルは次のとおりです。

this # target for substitution
this is a test
another test?

今私に解放するここからそしてここから接続済みPost、どういうわけかこれを行う方法を理解します。

sed 's/^this$/test/g' testfile

これは効果があるか、少なくともそうです。なぜなら単語の末尾の改行文字thisはそのまま残ります。

test # target for substitution but newline is still there
this is a test
another test?

上記の内容を見ると、知っている sed改行文字を直接一致させる方法はありません(一部のバージョンでは「\ n」を使用できることを覚えていますが、sedこれは要点ではありません)。

私は少なくとも全体の単語/行と改行文字を削除する方法を知っています。

sed '/^this$/d' testfile

しかし、代わりに使用する必要があります。

どうすればいいですか? (sed最大)

答え1

thistest私が理解しているところによると、単語と改行文字だけで構成される行を変更したいので

foo
this
this is a test

しなければならない

foo
testthis is a test

sed次の行に参加し、N改行文字の前のすべての内容を変更するだけです。

sed '/^this$/{N;s/.*\n/test/;}'

答え2

ここで使用することをお勧めします。構文はperlこの例と変わりません。sed

$ cat ip.txt
this
this is a test
another test?

$ perl -pe 's/^this\n/XYZ/' ip.txt
XYZthis is a test
another test?

答え3

GNU sedを使用すると、すべての行をメモリに読み込んで-zそこから一致させることができます。たとえば、次のようになります。

sed -z 's/this\n/test/'

答え4

awkを使用する1つの方法は、次を操作してレコード区切り文字を出力することです。

$ awk '{ ORS = sub(/^this$/,"FOO") ? "" : RS }1' file

$ sed -e '
    $!N
    s/^this\n/FOO/;t
    P;D
' file

関連情報