正規表現に問題があります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
シーケンスは単語の境界を表しているため、部分一致を除外します。たとえば、Hostname
GNU sedでは、ieの代わりに\<
新しいテキストを行に入れることもできます。\>
\<Host\>
sed '/\<Host\>/cmy new text' hostfile
これが式で目指しているようです。実際のc
コマンドを見逃して、単語境界指定子を逆さまに持ってきた。つまり、代わり<\. . .>\
に\<. . .\>
答え2
$ sed 's/^.*[[:<:]]Host[[:>:]].*$/replacement text/' file.txt
file.txt
上記のコードは、その単語を含むファイルのすべての行を文字列に置き換えます。結果は標準出力として提供されます。Host
replacement text
これは[[:<:]]
、単語の先頭に一致する長さがゼロのパターンです。同様に[[:>:]]
、単語の終わりも一致します。これは上記の交換ですいいえHostname
1行をorという単語に置き換えますxHost
(該当する単語がHost
行の他の場所に表示されない限り)。