繁体   English   中英

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

[英]Replace backtick with single quote using sed or awk

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

首先,我尝试在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

问题是,我正在使用应用于文档的另一个脚本,其中提到的脚本用其文字表示替换每个十六进制或八进制代码。 我能够以另一种方式做到这一点,我只是好奇如果提到替换可以使用而不使用十六进制或八进制代码。

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

s='abc´def´123´foo'

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

在文件上运行tr

tr '´' "'" < file

我不知道从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

你在php里面调用shell函数是什么? phpstr_replace函数,可以为你做这个工作。

<?php
echo str_replace("`","'","He`lo w`rld!");
?>

你可以使用Bash:

while read line; do
    echo ${line//\´/\'}
done < file.txt

这可能适合你(GNU sed):

sed 'y/`/'\''/' file

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM