我正在使用sed捕获文本,运行外部命令并将捕获组的输出值输出到屏幕并进入文件。
这是我需要的命令示例:
echo testme | sed -r 's/([a-z]{4}).*/'"$(echo "\1" | tee out.txt)"'/g'
也就是说,我需要输出捕获组( \ 1 )的值( 测试 )一份文件。
但是在屏幕上我可以看到正确的文字:
test
在文件中我看到以下内容:
\1
当输出到文件而不是屏幕时,似乎捕获组的符号不会扩展其值。
请告诉我,我做错了什么以及如何将捕获组的值输出到文件中。
请尽可能 - 没有grep / awk的解决方案。我需要使用sed(或者可能是ssed)来做到这一点。
谢谢!
答案 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