gpt4 book ai didi

bash - 如何在 sed 和 awk(和 perl)中搜索和替换任意文字字符串

转载 作者:行者123 更新时间:2023-11-29 09:36:02 25 4
gpt4 key购买 nike

假设我们在文件中有一些任意文字,我们需要用其他文字替换。

通常,我们只需使用 sed(1) 或 awk(1) 并编写如下代码:

sed "s/$target/$replacement/g" file.txt

但是,如果 $target 和/或 $replacement 可能包含对 sed(1) 敏感的字符,例如正则表达式,该怎么办?你可以逃避它们,但假设你不知道它们是什么——它们是任意的,好吗?您需要编写一些代码来转义所有可能的敏感字符——包括“/”分隔符。例如

t=$( echo "$target" | sed 's/\./\\./g; s/\*/\\*/g; s/\[/\\[/g; ...' ) # arghhh!

对于这样一个简单的问题来说,这是相当尴尬的。

perl(1) 有\Q ...\E 引号,但即使这样也无法处理 $target 中的 '/' 分隔符。

perl -pe "s/\Q$target\E/$replacement/g" file.txt

我刚刚发布了一个答案!!所以我真正的问题是,“有没有更好的方法在 sed/awk/perl 中进行文字替换?”

如果没有,我会把它留在这里以备有用。

最佳答案

quotemeta ,它实现了 \Q,绝对可以满足您的要求

all ASCII characters not matching /[A-Za-z_0-9]/ will be preceded by a backslash

因为这大概是在 shell 脚本中,所以问题实际上是 shell 变量如何以及何时被插值,以及 Perl 程序最终会看到什么。

最好的方法是避免计算出插值困惑,而是将这些 shell 变量正确地传递给 Perl 单行代码。这可以通过多种方式完成;见this post了解详情。

要么将 shell 变量简单地作为参数传递

#!/bin/bash

# define $target

perl -pe"BEGIN { $patt = shift }; s{\Q$patt}{$replacement}g" "$target" file.txt

@ARGV 中删除所需的参数并在 BEGIN block 中使用,因此在运行前;然后 file.txt 得到处理。此处的正则表达式中不需要 \E

或者,使用 -s switch , 为程序启用命令行开关

# define $target, etc

perl -s -pe"s{\Q$patt}{$replacement}g" -- -patt="$target" file.txt

需要--来标记参数的开始,开关必须在文件名之前。

最后,您还可以导出 shell 变量,然后可以通过 %ENV 在 Perl 脚本中使用这些变量;但总的来说,我宁愿推荐上述两种方法中的任何一种。


一个完整的例子

#!/bin/bash
# Last modified: 2019 Jan 06 (22:15)

target="/{"
replacement="&"

echo "Replace $target with $replacement"

perl -wE'
BEGIN { $p = shift; $r = shift };
$_=q(ah/{yes); s/\Q$p/$r/; say
' "$target" "$replacement"

这打印

Replace /{ with &ah&yes

where I've used characters mentioned in a comment.

The other way

#!/bin/bash
# Last modified: 2019 Jan 06 (22:05)

target="/{"
replacement="&"

echo "Replace $target with $replacement"

perl -s -wE'$_ = q(ah/{yes); s/\Q$patt/$repl/; say' \
-- -patt="$target" -repl="$replacement"

这里的代码为了可读性而被分行(因此需要 \)。相同的打印输出。

关于bash - 如何在 sed 和 awk(和 perl)中搜索和替换任意文字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54059656/

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