我需要打印具有重复字段的行,尝试使用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可用,请使用-Pperl

$ 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)匹配整个字段,礼貌地针对非空格字符进行环视断言

10-04 22:53