使用sed或awk用单引号替换反引号

Mat*_*sík 3 php regex bash awk sed

我想使用PHP shell_exec()内的sed或awk在特定文本文档中用´单引号()替换所有反引号(),'而不使用十六进制或八进制代码。

首先,我尝试了以下在shell脚本中运行的命令:

sed -e 's/´/'"'"'/g' file.txt;
sed -e 's/\´/'"'"'/g' file.txt;
sed -e 's/´/'/g' file.txt;
sed -e 's/\´/'/g' file.txt;
sed -e 's/"´"/'"'"'/g' file.txt;
awk '{gsub(/\´/, "\'" ) }1' file.txt;
Run Code Online (Sandbox Code Playgroud)

但是这些都不起作用。

input.txt文件示例:

abc´def´123`foo'456;
Run Code Online (Sandbox Code Playgroud)

output.txt文件的示例:

abc'def'123`foo'456
Run Code Online (Sandbox Code Playgroud)

使用从终端运行的sed命令,此解决方案有效:

echo "a´b´c;" | sed "s/´/'/g"
Run Code Online (Sandbox Code Playgroud)

输出为:

a'b'c;
Run Code Online (Sandbox Code Playgroud)

但是从可执行文件test.sh运行它:

#!bin/bash
sed "s/´/'/g" input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

作为命令执行的shell脚本

bash test.sh
Run Code Online (Sandbox Code Playgroud)

它不起作用,并且output.txt文件的内容与input.txt文件的内容相同。

但是,使用正向勾号,它的工作原理和结果

#!bin/bash
sed "s/\`/'/g" input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

是带有内容的output.txt文件

abc´def´123'foo'456;
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用字符的十六进制或八进制表示形式将单引号替换为后引号时,它就像一个超级字符。

使用sed:

input.txt  - abc´def´123`foo'456;
command    - sed 's/\xB4/'"'"'/g' input.txt > output.txt;
output.txt - abc'def'123`foo'456
Run Code Online (Sandbox Code Playgroud)

使用awk:

input.txt  - abc´def´123`foo'456;
command    - awk '{gsub(/\264/, "\047" )}1' input.txt > output.txt;
output.txt - abc'def'123`foo'456
Run Code Online (Sandbox Code Playgroud)

问题是,我使用的是另一个脚本,该脚本已应用到文档中,其中提到的脚本用其文字表示形式替换了每个十六进制或八进制代码。我可以用另一种方式做,我很好奇是否可以在不使用十六进制或八进制代码的情况下使用提到的替换方法。

anu*_*ava 5

您可以使用tr适当的引用:

s='abc´def´123´foo'

tr '´' "'" <<< "$s"
abc'def'123'foo
Run Code Online (Sandbox Code Playgroud)

tr在文件上运行:

tr '´' "'" < file
Run Code Online (Sandbox Code Playgroud)