$ 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 的行file1
,file2...
index($_, $ENV{LINE}) >= 0
您可以使用来m{^\s*\Q$ENV{LINE}\E\s*$}
匹配由export LIBVIRT_DEFAULT_URI='qemu:///system'
可选的前面或后面有空格组成的行。