Gnu Sed:空白文字クラスが行末文字と一致しません。

Gnu Sed:空白文字クラスが行末文字と一致しません。

パターン: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

関連情報