Sedと正規表現

Sedと正規表現

正規表現に問題がありますsed

ファイルの1行を変更したいので、次のようにしました。

sed -i '3s/.*/my new text in file/' file.txt

この拡張はファイルの3行目を見つけて変更します。

この解決策は良くありませんが、良い一般的な拡張を構築する方法がわかりません。ファイルで「ホスト」という単語を探しているとしましょう。良い一般的な拡張を構築する方法は?

私は以下を試しました:

sed -e '<\H...s>\ /my new text in file/' file.txt'。

私は何が間違っていましたか?

答え1

ほとんど誰も使用しないようですが、行全体を置き換えるための(変更)コマンドをsed提供します。c

c\ 
text

    Delete the lines matching the address or address-range, and 
    output the lines of text which follow this command.

たとえば、次のように使用できます。

sed '/\bHost\b/c\                      
my new text
' file

単語全体を含む行Hostをに変更しますmy new text。この\bシーケンスは単語の境界を表しているため、部分一致を除外します。たとえば、HostnameGNU sedでは、ieの代わりに\<新しいテキストを行に入れることもできます。\>\<Host\>

sed '/\<Host\>/cmy new text' hostfile

これが式で目指しているようです。実際のcコマンドを見逃して、単語境界指定子を逆さまに持ってきた。つまり、代わり<\. . .>\\<. . .\>

答え2

$ sed 's/^.*[[:<:]]Host[[:>:]].*$/replacement text/' file.txt

file.txt上記のコードは、その単語を含むファイルのすべての行を文字列に置き換えます。結果は標準出力として提供されます。Hostreplacement text

これは[[:<:]]、単語の先頭に一致する長さがゼロのパターンです。同様に[[:>:]]、単語の終わりも一致します。これは上記の交換ですいいえHostname1行をorという単語に置き換えますxHost(該当する単語がHost行の他の場所に表示されない限り)。

関連情報