Php 使用sed或awk将反勾号替换为单引号

Php 使用sed或awk将反勾号替换为单引号,php,regex,bash,sed,awk,Php,Regex,Bash,Sed,Awk,我想在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

我想在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;
但这些都不起作用

input.txt文件的示例:

abc´def´123`foo'456;
abc'def'123`foo'456
output.txt文件的示例:

abc´def´123`foo'456;
abc'def'123`foo'456
使用从终端运行的sed命令,此解决方案可以工作:

echo "a´b´c;" | sed "s/´/'/g"
输出为:

a'b'c;
但是从可执行文件test.sh运行它:

#!bin/bash
sed "s/´/'/g" input.txt > output.txt
作为由命令执行的shell脚本

bash test.sh
它不工作,output.txt文件的内容与input.txt文件的内容相同

然而,通过向前勾号,它可以工作,结果是

#!bin/bash
sed "s/\`/'/g" input.txt > output.txt
是包含内容的output.txt文件

abc´def´123'foo'456;
然而,当我试图用使用十六进制或八进制表示的字符的单引号替换向后的记号时,它就像一个符咒

使用sed:

input.txt  - abc´def´123`foo'456;
command    - sed 's/\xB4/'"'"'/g' input.txt > output.txt;
output.txt - abc'def'123`foo'456
使用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

问题是,我正在使用另一个应用于文档的脚本,该脚本使用文本表示替换每个十六进制或八进制代码。我可以用另一种方式来做,我只是好奇,如果不使用十六进制或八进制代码,是否可以使用上述替换。

您可以使用
tr
,并适当引用:

s='abc´def´123´foo'

tr '´' "'" <<< "$s"
abc'def'123'foo

我不知道如何从php调用脚本,但您是否尝试过:

sed "s/´/'/g" file.txt
看:

我认为您使用了错误的勾号,因为您所说的tr解决方案正在替换与您在问题中要求替换的不同的勾号(向前勾号与向后勾号)。如果是这样的话,那么您需要避开反勾选:

sed "s/\`/'/g" file.txt 

$ echo "a\`b" | sed "s/\`/'/g"
a'b
试试这个:

sed "s/\`/'/" file.txt

您在
php
中调用什么shell函数
php
具有
str\u replace
函数,可以为您的用户完成此项工作

<?php
echo str_replace("`","'","He`lo w`rld!");
?>
您可以使用Bash:

while read line; do
    echo ${line//\´/\'}
done < file.txt
读行时
;做
echo${line/\'/\'/\'}
完成
这可能适合您(GNU-sed):


你不需要避开反勾字符吗?不,没有什么特别的。仅仅说“不起作用”并不能帮助我们找出问题所在。更新您的问题,告诉我们您是否遇到语法错误、意外输出、内核转储或其他任何有助于我们缩小问题范围的问题。好的,当在终端内部使用时,它可以工作,但当从以下文件使用时“#!bin/bash sed“s/'/'/'/g”input.txt>output.txt”然后,output.txt文件看起来与input.txt文件完全相同。我不知道我做错了什么,但你已经接受了答案,所以我怀疑是否还有人在看这个问题。如果我是你的话,我会从一个新的、清晰的问题开始,如果PHP不重要的话,我会把它们删除。谢谢,这很快:)对于tr,它工作得很好。您的解决方案对于前向勾号非常有效,但是对于后向勾号不起作用,我要求使用后向勾号解决方案。注意:对于前向勾号和后向勾号都有效。我知道这个解决方案,谢谢,它工作得很好。但是我在一个有几十万行的大型xml文件上使用多行命令和shell_exec()by cron job,要使用str_replace(),我必须将这个文件保存到变量中,它不如使用专门为文本处理设计的语言有效。
sed 'y/`/'\''/' file