gpt4 book ai didi

linux - 使用任何东西作为 sed 或 Perl 正则表达式的输入?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:26 26 4
gpt4 key购买 nike

如果我这样做

comment () { sed -i "/$1/s/^/$2 /g" $3 }

comment /dev/sysmsg '#' /tmp/1
comment '*.err' '#' /tmp/1

输入文件

*.err;kern.notice;auth.notice   /dev/sysmsg
fff
ff

然后它就中断了,因为 /sed 中用作分隔符,并且 * 也被视为正则表达式。

问题

有没有办法让它更健壮,所以 $1 中的输入字符串可以包含我想要的任何内容?或者我需要转向 Perl 吗?

最佳答案

当然,使用 bash 参数替换来转义麻烦的斜杠字符:

comment () { sed -i "/${1//\//\\/}/ s/^/${2//\//\\/} /" "$3"; }

注意事项:

  • 您需要保护图案和替换部分中的斜线。
  • 如果您的搜索是锚定的,则使用“g”是没有意义的,因为该模式最多只能匹配一次。
  • 引用所有变量:如果文件名包含空格,您的代码就会中断。
  • 单行函数在右大括号前需要一个分号。

演示

$ cat file
test/1/
test/2/
test/3/

$ comment 'test/2' '//' file

$ cat file
test/1/
// test/2/
test/3/

我意识到我没有转义正则表达式特殊字符。最安全的方法是转义任何非字母数字字符:

comment () { 
local pattern=$(sed 's/[^[:alnum:]]/\\&/g' <<<"$1")
local replace=${2//\//\\/}
local file=$3
sed -i "/$pattern/ s/^/$replace /" "$file"
}

但是既然你想做纯文本匹配,sed 可能不是最好的工具:

comment() { 
perl -i -pse '$_ = "$leader $_" if index($_, $search) > -1' -- \
-search="$1" \
-leader="$2" \
"$3"
}

关于linux - 使用任何东西作为 sed 或 Perl 正则表达式的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49797238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com