从 diff 输出中删除多余的字符

从 diff 输出中删除多余的字符

我有来自 unix 的以下输出:

$ diff -y --suppress-common-lines backup.txt newfile.txt
                                                              > `jjj' int,

我只需要jjj : int作为输出。尝试以下方法未按预期工作:

$ diff -y --suppress-common-lines backup.txt newfile.txt | grep -i '>' |tr -d '[>]'  |sed 's/,//g'

在此输入图像描述

答案1

像这样的东西awk可以完成这项工作:

diff -y --suppress-common-lines backup.txt newfile.txt|awk -F'[>,]' '{gsub(/ /,"")} {print $2} '

答案2

你可以diff通过以下方式告诉你:

diff --old-line-format= \
     --unchanged-line-format= \
     --new-line-format=%L backup.txt newfile.txt

要对输出进行后处理diff -y,您可以执行以下操作:

diff  -y --suppress-common-lines backup.txt newfile.txt |
  LC_ALL=C sed -n $'s/^[[:blank:]]*>\t//p'

但这并不是万无一失的,如果backup.txt可能包含像这样的行[blanks]>[TAB][anything]

$'...'是 ksh93 中的一种特殊类型的引用(现在其他一些 shell 也支持),其中\t扩展为 TAB 字符。的 GNU 实现不需要它sed,其中\t已经匹配 TAB (尽管不是内括号表达式)。

C区域设置中,[[:blank:]]匹配空格或制表符。

通过管道将它们传送到

tr -d \`\',

从输出中删除`,'和字符。,

并:

sed 's/[[:space:]]\{1,\}/ : /g'

将每一行上的一个或多个空白字符序列替换为" : ".

或者将两者合并为一个sed命令:

sed 's/[`,'\'']//g; s/[[:space:]]\{1,\}/ : /g'

sed或者与后处理并排输出的命令结合使用:

sed $'s/^[ \t]*>\t/!d
      s///p
      s/[`,'\'']//g
      s/[[:space:]]\{1,\}/ : /g'

相关内容