grep:如何将匹配捕获到变量中?

时间:2016-04-02 15:01:20

标签: linux bash shell unix grep

说我有一个看起来像这样的文本文件:

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表达这一点?如果这是一个天真的问题,我很抱歉,但我对正则表达式并不精通,所以请原谅我。

5 个答案:

答案 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.txtfoo: 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