sedを使用して正確な単語を変更したい

sedを使用して正確な単語を変更したい

"私の目標は、ファイルに次の単語が表示されたときに二重引用符を追加することです。

VGHIER_TSV_WB798
CBVGHIER_TSV_WB798

ここ

sed -i 's/"VGHIER_TSV_WB798"./VGHIER_TSV_WB798./g'

二重引用符がある場合は、削除に使用されます。

sed -i 's/VGHIER_TSV_WB798./"VGHIER_TSV_WB798"./g'

引用文を追加しましたが、引用文を受け取ったときに問題CBVGHIER_TSV_WB798はに変わったということです CB"VGHIER_TSV_WB798"。 2番目の単語を置き換えるために別々のsedステートメントを使用したくありません。

sed -i 's/CBVGHIER_TSV_WB798./"CBVGHIER_TSV_WB798"./g'

上記の要件を達成する方法をお手伝いできますか?

答え1

EREをサポートしている場合は、一致するパターンのオプション部分としてsed追加できます。CBこれは、次の両方を置き換えます。

sed -E 's/(CB)?VGHIER_etc/"\1VGHIER_etc"/g'  test

または、単語の始まりと終わりでandをsedサポートしている場合は、次を使用してください。\<\>

sed 's/\<VGHIER_etc\>/"VGHIER_etc"/g'  test

また、パターンに末尾の点がある場合は、.すべての文字と一致し、文字列の一部に置き換えられます。交換したポイントは元のポイントに戻ります。にs/foo./"foo"./変更food"foo".

答え2

検索文字列に先行するプレフィックスを追加したいと思います。置き換えたい単語の前に常にスペースがある場合:

sed -i 's/ VGHIER_TSV_WB798\./ "VGHIER_TSV_WB798"./g'

より一般的には、正規表現のグループ化を使用して、前の[[:space:]]スペースやタブなどのケースを処理できます(man isspace全リストについては参考文献を参照)。

sed -i 's/\([[:space:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

この場合、エスケープされた括弧を使用して正規表現のグループ化を作成し、次のように複雑さを追加する必要があります。逆参照 \1置換を実行するときに正確な文字が失われないようにします。[[:punct:]]句読点の1つが単語の前に表示される場合に備えて、句読点の正規表現クラスもあります。man isspace各正規表現文字クラスでカバーされる完全な詳細のリストについては、参考資料を参照してください。

可能な句読点プレフィックスの場合を扱うより複雑なサンプルソリューションは次のとおりです。

sed -i 's/\([[:space:]]\|[[:punct:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

これは代替を示すために正規表現ディレクティブ|(バックスラッシュでエスケープされていますsed)を利用します。

最後に、^正規表現を使用して、その単語が常に行の最初の項目であることを要求します。

sed -i 's/^VGHIER_TSV_WB798\./"VGHIER_TSV_WB798"./g'

はい、上記の場合、文字列を「グループ化」して「逆参照」できます。

sed -i 's/^\(VGHIER_TSV_WB798\)\./"\1"./g'
sed -i 's/\([[:space:]]\|[[:punct:]]\)\(VGHIER_TSV_WB798\)\./\1"\2"./g'

関連情報