我想使用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;
output.txt文件示例:
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
问题是,我正在使用应用于文档的另一个脚本,其中提到的脚本用其文字表示替换每个十六进制或八进制代码。我能够以另一种方式做到这一点,我只是好奇如果提到替换可以使用而不使用十六进制或八进制代码。
答案 0 :(得分:4)
您可以tr
使用适当的引语:
s='abc´def´123´foo'
tr '´' "'" <<< "$s"
abc'def'123'foo
在文件上运行tr
:
tr '´' "'" < file
答案 1 :(得分:2)
我不知道从php调用脚本但是你只是尝试:
sed "s/´/'/g" file.txt
查找
$ echo "a´b" | sed "s/´/'/g"
a'b
我认为你使用了错误的勾号,因为你说的有效的解决方案正在替换你在问题中要求替换的那个(正向滴答与向后勾选)。如果是这样,那么你将需要逃避反击:
sed "s/\`/'/g" file.txt
$ echo "a\`b" | sed "s/\`/'/g"
a'b
答案 2 :(得分:1)
你在php
内调用shell函数是什么? php
具有str_replace
功能,可以为您完成此任务。
<?php
echo str_replace("`","'","He`lo w`rld!");
?>
答案 3 :(得分:1)
你可以使用Bash:
while read line; do
echo ${line//\´/\'}
done < file.txt
答案 4 :(得分:1)
这可能适合你(GNU sed):
sed 'y/`/'\''/' file
答案 5 :(得分:0)
试试这个:
sed "s/\`/'/" file.txt