我需要打印具有重复字段的行,尝试使用sed
无法正常工作。
输入文件有两行:
s1/s2/s3/s4/s5/u0 a1_b2_c3_d4_e5_f6_g7 s1/s2/s3/s4/s5/u1
s1/s2/s3/s4/s5/u0 a1_b2_c3_d4_e5_f6_g7 s1/s2/s3/s4/s5/u0
输出应该仅是第二行,因为它具有完全重复的字符串(字段)。
但是它使用以下命令打印两行
sed -rn '/(\b\w+\b).*\b\1\b/ p' input_file
谢谢
RKP
最佳答案
如果grep
可用,请使用-P
或perl
$ cat ip.txt
s1/s2/s3/s4/s5/u0 a1_b2_c3_d4_e5_f6_g7 s1/s2/s3/s4/s5/u1
s1/s2/s3/s4/s5/u0 a1_b2_c3_d4_e5_f6_g7 s1/s2/s3/s4/s5/u0
2.5 42 32.5 abc
3.14 3.14 123
part cop par
$ grep -P '(?<!\S)(\S++).*(?<!\S)\1(?!\S)' ip.txt
s1/s2/s3/s4/s5/u0 a1_b2_c3_d4_e5_f6_g7 s1/s2/s3/s4/s5/u0
3.14 3.14 123
$ perl -ne 'print if /(?<!\S)(\S++).*(?<!\S)\1(?!\S)/' ip.txt
s1/s2/s3/s4/s5/u0 a1_b2_c3_d4_e5_f6_g7 s1/s2/s3/s4/s5/u0
3.14 3.14 123
没有无空白字符的
(?<!\S)
断言(\S++)
捕获所有非空白字符,所有格修饰符可确保部分字段不匹配.*
之间的任意数量的字符(?<!\S)\1(?!\S)
匹配整个字段,礼貌地针对非空格字符进行环视断言