San*_*eep 2 bash sed shell-script
我有一个问题sed
,我可以使用以下简单示例重新创建。
考虑以下输入文件 ( input.txt ):
C:\A\quick\brown\fox\ jumps over the lazy dog
C:\A\quick\brown\fox\ ran with the hounds
Run Code Online (Sandbox Code Playgroud)
我想生成以下输出
C:\Animal\ jumps over the lazy dog
C:\Animal\ ran with the hounds
Run Code Online (Sandbox Code Playgroud)
我尝试使用 sed 创建一个简单的 shell 脚本,但它没有执行所需的替换。这是我的脚本:
FROM_PATTERN="C:\A\quick\brown\fox\"
TO_PATTERN="C:\Animal\"
#FROM_PATTERN="C:\\A\\quick\\brown\\fox\\" # Escaping backslash does not help either
#TO_PATTERN="C:\\Animal\\" # Escaping backslash does not help either
sed 's/$FROM_PATTERN/$TO_PATTERN/g' input.txt
#sed 's/"$FROM_PATTERN"/"$TO_PATTERN"/g' input.txt # Quoting the pattern does not help either
Run Code Online (Sandbox Code Playgroud)
我正在运行bash
版本GNU bash, version 4.4.12(3)-release-(x86_64-unknown-cygwin)
\
很特别:
"
、$
、`
和继续行。s
在命令sed
。s
sed
命令的替换部分,它可以转义&
、自身和换行符(或\n
在某些sed
实现中引入 C 风格的转义序列)。另请注意,shell 参数扩展不在单引号字符串中执行。
所以在这里,你想要:
\
字符周围使用单引号而不是双引号\
为s
命令的左侧和右侧转义from_regexp='C:\\A\\quick\\brown\\fox\\'
escaped_replacement='C:\\Animal\\'
sed "s/$from_regexp/$escaped_replacement/g" < your-file
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用perl
代替sed
固定字符串替换的地方,而不必担心特殊字符,如果您这样做:
from='C:\A\quick\brown\fox\'
to='C:\Animal\'
FROM=$from TO=$to perl -pe 's/\Q$ENV{FROM}\E/$ENV{TO}/g' < your-file
Run Code Online (Sandbox Code Playgroud)
另请参阅如何确保插入到 `sed` 替换中的字符串转义所有元字符以处理任意字符串。