将complex tr命令转换为sed语句

时间:2014-10-17 09:19:37

标签: awk sed grep tr

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

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

我的工作流程类似于以下内容:

  1. 用管道替换标签
  2. 用管道替换管道+新线路
  3. 挤出重复的管道
  4. 用新行替换“标记”
  5. 删除额外的|在每一行
  6. (我在使用sed替换标签,换行等方面遇到了问题,这就是我使用tr的原因)

3 个答案:

答案 0 :(得分:0)

sed -n 'H;${s/\t/|/g;s/\|\n/|/g;s/\|{2,\}/|/;s/"/\
/g;s/\(\n\)\|\{1,\}/\1/g;s/.//p;}' file.txt

由于可能会在每次修改后创建新的可忽略模式,因此您的订单和顺序很难更改。

答案 1 :(得分:0)

这可能适合你(GNU sed):

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

最后一项操作有点模棱两可 - 删除|或删除该行?

我选择删除|

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

答案 2 :(得分:0)

没有样本输入和预期输出,只是猜测,但这可能会做你想要的:

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

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

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