パターン:abcの後にスペースまたは行の最後の文字が続きます。
orig="abc[[:space:]]+";
new=Hello
sed -i -r -e "s|${orig}|${new}|g" ./file ;
文書:
abc
abcd
abc
abc d
実行後:
abc
abcd
abc
Hellod
予想出力:
Hello
abcd
Hello
Hello d
私は何を見逃していますか?
注:空白文字を保持したいと思います。
答え1
もし必要なのはスペースを予約することです。
注:空白文字を保持したいと思います。
その後、一致しますが、交換時に復元します。
orig='abc([[:space:]]+)'
new='Hello\1'
sed -E -e "s|${orig}|${new}|g" ./infile ;
これにより、次の出力が生成されます(修正するには適切な-i
オプションを追加してください)。
Hello
abcd
Hello
Hello d
もちろん、これはファイルの一部の行の末尾にスペースがあると仮定します。
$ cat infile | sed -n l
abc $
abcd $
abc $
$
abc d$
空白で終わらない行を一致させるために正規表現が必要な場合は、より複雑な正規表現が必要です。
orig='abc([[:space:]]+|$)';
new='Hello\1';
sed -E -e "s,${orig},${new},g" ./infile ;
もちろん、正規表現で必要な置換との競合を避けるs|||
ために区切り文字を変更する必要があります。s,,,
|
答え2
スペースを一致させてキャプチャしてから再挿入する必要はありません。 「abc」を検索してください。独立した単語。 GNU sedの場合\<
と\>
単語の境界として使用してください。
sed 's/\<abc\>/Hello/g' file
Hello
abcd
Hello
Hello d
パターンと置換を変数に入れるには、バックスラッシュを適切に引用するように注意してください。
pattern="\\<abc\\>" # or: pattern='\<abc\>'
replacement=Hello
sed "s/$pattern/$replacement/" file