11

私はsedを理解していると思っていましたが、そうではないと思います。次の 2 つのファイルがあり、"why" と "huh" の行を 1 つの別の行に置き換えたいと考えています。空白はまったくありません。

test.txt:

hi
why
huh
hi
why
huh

test2.txt:

1
hi
why
huh
hi
why
huh

次の 2 つのコマンドでは、次の結果が得られます。

sed "N; s/<why\/>\n<huh\/>/yo/g" test.txt > out.txt

out.txt:
hi
why
huh
hi
yo

sed "N; s/<why\/>\n<huh\/>/yo/g" test2.txt > out2.txt

out2.txt:
1
hi
yo
hi
why
huh

sedについて理解していないことは何ですか? 両方の出力ファイルに次のものが含まれていないのはなぜですか。

hi
yo
hi
yo
4

3 に答える 3

11

あなたの表現はほぼ正しいですが、2 つの問題があります。

  • why単語として一致させたい場合は\<\>前後に配置する必要があります。あなたはちょうど<その\/>周りに置きました。したがって、最初の修正は次のとおりです。

    $ sed 'N; s/\<why\>\n\<huh\>/yo/g' test.txt
    
  • ただし、次の場合も機能しません。

    $ sed 'N; s/\<why\>\n\<huh\>/yo/g' test.txt
    hi
    why
    huh
    hi
    yo
    

    2 番目のペアの行だけを置き換えるのはなぜですか? 最初の行で、Nコマンドは に連結whyhiれ、パターン スペースに文字列が残りますhi\nwhy。この文字列はs///コマンドと一致しないため、行は単に出力されます。次回huhは、パターン スペースに文字列があり、それに連結hiします。次の行why\nhuhでは、パターン スペースが置換されます。

    解決策は、アドレスwhyを使用して、現在の行が の場合にのみ次の行を連結することです。 /^why$/

    $ sed '/^why$/ {N; s/\<why\>\n\<huh\>/yo/g}' test.txt
    hi
    yo
    hi
    yo
    
于 2012-06-27T20:25:35.330 に答える
1

これはtest.txtファイルで機能するはずです:

sed '/hi/! { N ; s/why\nhuh/yo/ }' test.txt

その意味は:

行中に見つからない場合hi( となりますwhy)、次の行を読み込んですべてを に置き換えますyo。それ以外の場合は直接印刷します ( の場合hi)。

出力:

hi
yo
hi
yo
于 2012-06-27T20:21:34.307 に答える