【问题标题】:converting complex tr command to sed statement将复杂的 tr 命令转换为 sed 语句
【发布时间】:2014-12-12 20:22:00
【问题描述】:

清理这个 unix 命令的“最佳”方法是什么? (例如,一个干净的 sed 命令)

cat file.txt | tr '\t' '|' | tr '|\n' '|' | tr -s '|' | tr '"' '\n' | sed "/^|/d"

我的工作流程如下所示:

  1. 用管道替换标签
  2. 只用一根管子替换管子 + 新线
  3. 挤出重复的管道
  4. 用新行替换 " 标记
  5. 删除额外 |每一行

(我在使用 sed 替换制表符、换行符等时遇到问题,所以这就是我使用 tr 的原因)

【问题讨论】:

  • 举个例子会更好。
  • 显示您的输入和所需的输出会更有帮助。有很多方法可以整理你所做的事情,但考虑到你正在尝试做的事情的确切知识,可能会有一种完全不同的方式来处理它。请更新您的问题。
  • 该过滤器的规格是什么,即需要转换或删除什么?如果没有这个,我们需要从您的(不优雅的)实现中对其进行逆向工程!
  • 对于同时涉及多个输入行的任何内容(例如连接行),您应该使用 awk。发布一些示例输入和预期输出。

标签: awk sed grep tr


【解决方案1】:
sed -n 'H;${s/\t/|/g;s/\|\n/|/g;s/\|{2,\}/|/;s/"/\
/g;s/\(\n\)\|\{1,\}/\1/g;s/.//p;}' file.txt

由于每次修改后都有可能创建新的符合条件的模式,您的顺序和顺序几乎无法更改。

【讨论】:

    【解决方案2】:

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

    sed 's/\t/|/g;:a;$!N;s/|\n/|/;ta;s/|\+/|/g;s/"/\n/g;s/^|//Mg;P;D' file
    

    最后一个操作有点模棱两可——去掉|还是去掉那行?

    我选择删除|

    要删除该行,请使用s/^|.*$//Mg

    【讨论】:

      【解决方案3】:

      如果没有样本输入和预期输出,这只是猜测,但这可能会满足您的需求:

      awk -v RS='^$' -v ORS= '{ gsub(/\t/,"|"); gsub(/\|\n/,"|"); gsub(/\|+/,"|"); gsub(/"/,"\n"); gsub(/(^|\n)\|/,""); print }' file
      

      以上使用 GNU awk 进行多字符 RS。

      一旦您向我们展示了预期的输入/输出,可能有一个更简单的 awk 解决方案,上面只是将您的 tr 和 sed 命令转换为 awk 语法,这可能不是惯用的最佳方法。

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 2021-07-06
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多