如何使用 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'可选的前面或后面有空格组成的行。

相关内容