sedまたはawkを使用して特殊文字を持つ変数を識別するにはどうすればよいですか?

sedまたはawkを使用して特殊文字を持つ変数を識別するにはどうすればよいですか?

$ echo "${BASH_VERSION}" 5.1.4(1)-release
Linux 5.18.0-17.1-liquorix-amd64 x86_64 GNU/Linux

文字列があり、export LIBVIRT_DEFAULT_URI='qemu:///system'ユーザーの文字列から行全体を見つけて削除したいと思います~/.profile。私は良い方法を知らない。 sedまたはawkの一般的な使用はエラーで失敗し、残念ながら私は問題を解決する方法を推測するにはあまりにも愚かすぎるか、または怠惰です(またはその両方)。

どこに$1ファイル名があり、$2検索する文字列があります。以下は一般的に機能しますが、場合によっては失敗するようです。

これはうまくいきません:awk "!/$2/" "$1" > "$1".tmp && mv "$1".tmp "1"
これもうまくいきません:sed -i "/$2/d" $1
これもうまくいきません: awk -vLine="$2" "!index($0,$2)" file

すべての提案および/または指示に感謝します。必ずしも必要な場合でなければPerlを使いたくないのですが、この時点では効果のある苦い薬を服用します。ありがとうございます。

ベストアンサー1

#! /bin/sh -
if [ "$#" -ge 2 ]; then
  export LINE="${1?}"
  shift
  perl -ni -e 'print unless index($_, $ENV{LINE}) >= 0' -- "$@"
fi

次のように使用してください。

that-script "export LIBVIRT_DEFAULT_URI='qemu:///system'" file1 file2...

export LIBVIRT_DEFAULT_URI='qemu:///system'from を含む行を削除するにはfile1file2...

index($_, $ENV{LINE}) >= 0オプションの先行スペースまたは末尾スペースで構成される行をm{^\s*\Q$ENV{LINE}\E\s*$}一致させるために使用できます。export LIBVIRT_DEFAULT_URI='qemu:///system'

おすすめ記事