说我有一个看起来像这样的文本文件:
foo: foo.txt
bar: baz.txt
quux: quux.txt
我想运行grep
查询,使第一行和第四行匹配,而第二行和第三行不匹配。基本上,我想做这样的事情:
grep '(capture the word): (ensure the same word is used here)\.txt' file.txt
我如何使用grep
表达这一点?如果这是一个天真的问题,我很抱歉,但我对正则表达式并不精通,所以请原谅我。
答案 0 :(得分:2)
grep -E '([^:]+): \1\.txt'
应该有效。
有关具体方法,请参阅https://regex101.com/r/qO3dO6/1。
编辑: 灵感来自@ walter-a
grep -E '(.*): \1\.txt'
也匹配:strange:foo: strange:foo.txt
答案 1 :(得分:2)
有趣。我从sed开始,发现和@jandob一样的解决方案。我的解决方案将接受strange:foo: strange:foo.txt
sed -n '/\(.*\): \1\.txt/p' file
修改:正在寻找oops: ops.txt
和foo: foo.txtbook
sed -n '/^\(.*\): \1\.txt$/p' file
答案 2 :(得分:1)
我会用awk来做这件事:
awk -F': *' 'BEGIN { f = 1 }
f && (NR == 1 || NR == 4) { f = NF == 2 && $1 ".txt" == $2 }
f && (NR == 2 || NR == 3) { f = NF != 2 || $1 ".txt" != $2 }
END { if (f) print "1st and 4th lines match, 2nd and 3rd do not" }' file
f
设置为true。f
仍然为真,就会在第一行和第四行执行第一个块。如果有两个字段,则f
保持为真,而在添加.txt
后,第一个匹配第二个字段。f
仍然为真,就会在第二行和第三行执行第二个块。如果没有两个字段(例如空行)或者它们不匹配,则f
保持为真。f
仍然为真,则会打印该消息。答案 3 :(得分:0)
假设您位于列出这些文件的文件夹中,
找到* .txt |切-d。 -f1 | grep -v bar | grep -v ^ $ |读线时 做 打印" $ {line}:$ {line} .txt"
find - 将列出文件夹中的文件.txt ext。
cut - 将在.txt之前获得第一部分。
grep -v将省略不需要的行。
接下来grep -will grep想要的线条
while循环将迭代剩余的行。
打印 - 将以所需格式打印
答案 4 :(得分:0)
FWIW这里的解决方案适用于所有系统的所有问题:
$ awk -F'[: .]+' 'NF && $1==$2' file
foo: foo.txt
quux: quux.txt