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` 替换中的字符串转义所有元字符以处理任意字符串。