0

我有“exp regex”行的文件。该文件可以包含带有其他文本的行。例如:

exp [a-zA-Z].*\.sh~$
exp test
tmp too
exp tmp
trololo

我需要 grep 这个文件的内容,egrep file '^exp ' | sed 's/^exp //'结果是:

[a-zA-Z].*\.sh~$
test
tmp

但我需要这个 grep 结果用 | 分隔 而不是 \n

[a-zA-Z].*\.sh~$|test|tmp

因为我需要将此结果用作另一个 grep 正则表达式。例如打印嵌套 grep 匹配的文件:

ls | egrep "`egrep file '^exp ' | sed 's/^exp //'\`"

嵌套 grep 后 | sed 替换

ls | egrep "[a-zA-Z].*\.sh~$|test|tmp"

或者有没有更好的方法从文件中导出正则表达式并将它们用于过滤文件?

肯特:我如何在替代中使用它?我认为是:

ls | egrep "`awk '/^exp /{sub(/^exp /,"");s=(s?s"|":s) sprintf("%s",$0)}END{print s}' file`"

但我可能错了。

4

2 回答 2

3

尝试这样做:

grep '^exp ' file.txt | sed 's/^exp //' | paste -sd '|'

甚至更好,不需要grepsedcad 本地做:

sed -n '/^exp/s/^exp //p' file.txt | paste -sd '|'

最后但并非最不重要的一点是,如果您对 one-liners 持开放态度:

perl -ne 'push @arr, $1 if /^exp (.*)/;END{print join "|", @arr}' file.txt
于 2013-03-17T15:57:45.323 回答
2

您可以保存grepand sed,并使用单个进程:awkone-liner

awk '/^exp /{sub(/^exp /,"");s=(s?s"|":s) sprintf("%s",$0)}END{print s}' file

测试一下:

kent$  on feature at master!? echo "exp [a-zA-Z].*\.sh~$
exp test
tmp too
exp tmp
trololo"|awk '/^exp /{sub(/^exp /,"");s=(s?s"|":s) sprintf("%s",$0)}END{print s}'
[a-zA-Z].*\.sh~$|test|tmp
于 2013-03-17T16:09:11.010 回答