0


我正在使用 sed 捕获文本、运行外部命令并将捕获组的输出值输出到屏幕和文件中。
这是我需要的命令示例:

echo testme | sed -r 's/([a-z]{4}).*/'"$(echo "\1" | tee out.txt)"'/g'

也就是说,我需要将捕获组(\1 )的值( test )输出到文件中。 但是在屏幕上我可以看到正确的文字:

test

在一个文件中,我看到以下内容:

\1

似乎捕获组的符号在输出到文件而不是屏幕时不会扩展其值。

请告诉我我做错了什么以及如何将捕获组的值输出到文件中。
如果可能,请 - grep/awk 没有解决方案。我需要使用 sed(或者可能是 ssed)来做到这一点。
谢谢!

4

2 回答 2

1

基本上你可以这样做,但我不确定这是否是你真正想要的:

echo testme | tee >(sed -r 's/([a-z]{4}).*/\1/g' > out.txt)

它会在屏幕上发送未修改的 testme,而过滤后的版本将发送到 out.txt。

如果要将过滤后的版本都发送到屏幕和文件,则可以在最后一部分使用 tee :

echo testme | sed -r 's/([a-z]{4}).*/\1/g' | tee out.txt

附加版本:

echo testme | tee >(sed -r 's/([a-z]{4}).*/\1/g' >> out.txt)

echo testme | sed -r 's/([a-z]{4}).*/\1/g' | tee -a out.txt
于 2013-09-14T00:43:57.523 回答
1

这可能对您有用(GNU sed):

sed -r '/([a-z]{4}).*/!b;s//\1/;w out.txt' file

或者:

sed -rn 's/([a-z]{4}).*/\1/p;T;s/.*/echo "&" | tee out.txt/e' file
于 2013-09-14T01:16:50.233 回答