【问题标题】:Sed: output value of capturing group into a filesed:捕获组的输出值到文件中
【发布时间】:2013-09-14 09:16:50
【问题描述】:


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

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

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

test

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

\1

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

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

【问题讨论】:

  • 其他不匹配的呢?它们将如何出现在标准输出中?

标签: linux bash sed


【解决方案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

【讨论】:

  • 就像一个魅力......非常感谢! :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 2011-03-19
    • 2010-10-13
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2012-11-23
    • 2019-04-19
    相关资源
    最近更新 更多