Sed:将组捕获到文件中的输出值

时间:2013-09-14 00:26:31

标签: linux bash sed


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

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

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

test

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

\1

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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