【问题标题】:Replace backtick with single quote using sed or awk使用 sed 或 awk 将反引号替换为单引号
【发布时间】:2014-03-24 05:12:58
【问题描述】:

我想在不使用十六进制或八进制代码的情况下,使用 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

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

【问题讨论】:

    标签: php regex bash sed awk


    【解决方案1】:

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

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

    在文件上运行tr

    tr '´' "'" < file
    

    【讨论】:

    • 谢谢,这很快 :) 使用 tr 可以完美运行。
    【解决方案2】:

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

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

    看:

    $ echo "a´b" | sed "s/´/'/g"
    a'b
    

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

    sed "s/\`/'/g" file.txt 
    
    $ echo "a\`b" | sed "s/\`/'/g"
    a'b
    

    【讨论】:

    • 你不需要转义反引号字符吗?
    • 不,没什么特别的。
    • 只是说它“不起作用”并不能帮助我们帮助您找出问题所在。更新您的问题,告诉我们您是否遇到语法错误、意外输出、核心转储或任何其他有助于我们帮助您缩小问题范围的内容。
    • 好吧,当在终端内部使用时,它可以工作,但是当从这样的文件中使用时,"#!bin/bash sed "s/´/'/g" input.txt > output.txt" 然后output.txt 文件看起来与 input.txt 文件完全相同。我不知道我做错了什么。
    • 本来可以,但您已经接受了答案,所以我怀疑是否有人再看这个问题。如果我是你,我会从一个新的、清晰的问题重新开始,如果它们实际上并不重要,就会丢失对 PHP 的引用。
    【解决方案3】:

    试试这个:

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

    【讨论】:

    • 您的解决方案适用于正向刻度,但不适用于反向刻度,我正在寻求具有反向刻度的解决方案。
    【解决方案4】:

    php 中的 shell 函数是什么? php 具有 str_replace 功能,可以为您完成这项工作。

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

    【讨论】:

    • 注意:适用于向前和向后刻度。
    • 我知道这个解决方案,谢谢,它有效。但是我在一个有几十万行的大型 xml 文件上通过 cron 作业使用 shell_exec() 的多行命令并使用 str_replace() 我必须将此文件保存到变量中,它不如使用专门为文本设计的语言有效处理。
    【解决方案5】:

    你可以使用 Bash:

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

    【讨论】:

      【解决方案6】:

      这可能对你有用(GNU sed):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-27
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 2017-08-05
        • 2020-12-23
        • 2020-03-27
        相关资源
        最近更新 更多