【问题标题】:Delete a specific string with tr使用 tr 删除特定字符串
【发布时间】:2012-05-04 04:22:42
【问题描述】:

是否可以在 UNIX-Shell 中使用 tr 命令删除特定字符串? 例如:如果我输入:

tr -d "1."

输入是1.1231,它会将23 显示为输出,但我希望它显示1231(注意只有第一个1 已经消失)。我该怎么做?

如果您知道解决方案或更好的方法,请解释一下语法,因为我不想只是复制粘贴,还想学习。

我对 awk 有很大的问题,所以如果你用这个,请多解释一下。

【问题讨论】:

  • 直接回答是“不”; tr 替换单个字符,而不是字符串。因此(a)您的命令将删除所有出现的“1”和“。”输入中的任何位置; (b) tr 不是您所询问的任务的正确命令。

标签: bash unix command tr


【解决方案1】:

在您上面的示例中,cut 命令就足够了。

示例:echo '1.1231' | cut -d '.' -f 2 将返回 1231

有关cut的更多信息,只需输入man cut

【讨论】:

    【解决方案2】:

    最好使用某种正则表达式(可能是 sed 之类的)。

    例如,对于输入 1.1231,您可以使用以下命令获得 1231 输出:

    sed 's/1\.//g'
    

    也许看看这里: http://tldp.org/LDP/abs/html/string-manipulation.html

    【讨论】:

    • “'tr' 的使用很好”,我同意这对于简单的表达式来说更易于使用和阅读。
    【解决方案3】:

    你也可以使用 sed 来做这种事情:

    $ echo "1.1231" | sed -e "s/1\.//"
    1231
    

    这只是使用 sed 运行正则表达式搜索和替换,替换“1”。 (带有适当的转义)与“”。默认只删除第一个匹配项。

    【讨论】:

      【解决方案4】:

      如果您使用bash,您可以使用parameter substitution轻松完成此操作:

      $ a=1.1231
      $ echo ${a#1.}
      1231
      

      这将删除 前导 "1." 字符串。如果你想删除直到 first 出现,使用${a#*1.},如果你想删除直到 last 出现,使用${##*1.} .

      string manipulation 上的 TLDP 页面有更多选项(例如子字符串提取)。

      请注意,使用标准的 sh 内置字符串操作工具进行此类简单转换总是比使用外部工具(例如 sedawkcut)快得多,因为 shell 不会必须创建一个子流程来执行操作。但是,对于更复杂的事情(例如,您需要使用正则表达式或输入较大时),您最好使用专用工具。

      【讨论】:

      • 这也是一个很好的解决方案!谢谢。
      【解决方案5】:

      由于您专门询问了awk,这里是另一个。

      awk '{ gsub(/1\./,"") }1' input.txt
      

      正如任何awk 教程会告诉你的那样,awk 程序的一般形式是“条件{动作}”序列。如果您没有任何操作,则默认操作是打印。如果您没有条件,则将无条件地采取行动。该程序同时使用了这两种特殊情况。

      第一部分是一个没有条件的动作,即它将对所有行执行。操作是用任何内容替换所有出现的正则表达式/1\./。所以这将修剪任何“1”。 (无论上下文如何)从一行中。

      第二部分是一个没有动作的条件,即如果条件为真则打印,并且条件始终为真。这是“我们完成了 - 打印我们现在拥有的任何东西”的常见习语。它仅由常量1 组成(当用作条件时,简单地表示“真”)。

      这可以通过多种方式重新表述。例如,您可以将打印因素纳入第一个操作;

      awk '{ gsub(/1\./,""); print }'  input.txt
      

      也许您想替换整数部分,即句号之前的任何数字。正则表达式类似于/[0-9]+\./

      gsub 是 GNU 扩展,因此如果您需要移植到旧版 awk 语法,您可能希望将其替换为 sub 或某种循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-19
        • 2011-08-21
        • 2018-02-28
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多