替换多个模式,其中一个有括号,另一个是制表符

替换多个模式,其中一个有括号,另一个是制表符

我有一个包含以下行的文本文件:

[...]
GFX Clocks and Power:
    800 MHz (MCLK)
    26 MHz (SCLK)
[...]

我想提取800 MHz它的一部分(该值不是恒定的),所以我想删除\t(MCLK)使用sed.

这是我现在的命令:

$ cat ~/test.txt | grep "(MCLK)" | xargs -0 sed -i -e $'s/\t//g' -e 's/\(MCLK\)//g'

运行时,返回:

sed: can't read     800 MHz (MCLK)
: No such file or directory

这似乎不是一个换行错误,也不是关于\t成为非标准字符的问题sed(cf.简单的 sed 选项卡替换神秘地失败) 应该被修复。

可能是什么问题?

答案1

如果你有pgrep

grep -Po '[0-9]+ [KMGT]?Hz(?= \(MCLK\))' test.txt

答案2

xargs获取其输入并将其转换为给定命令的参数。grep返回您感兴趣的行,并将xargs该行作为参数添加到sed需要文件名的命令中。你xargs根本不需要。

您可以告诉sed只对与模式匹配的行进行操作:

sed -i~ -e '/(MCLK)/{s/\t//g' -e 's/(MCLK)//g}' ~/test.txt

答案3

尝试这个,

sed '/(MCLK)/ s/(MCLK)//g;s/\t//' test.txt
800 MHz 
  • /(MCLK)/将搜索关键字。
  • s/(MCLK)//g将删除(MCLK).
  • s/\t//将删除选项卡。

您可以使用-i选项进行内联编辑。

对于您编辑的问题,

awk -F '[$\t ]' '/(MCLK)/ {print $2" "$3}' test.txt
800 MHz

答案4

尝试使用以下命令,效果也很好

命令

sed -n '/MCLK/p' filename| sed -r "s/^\s+//g"| sed -r "s/\(MCLK\)//g"

输出

sed -n '/MCLK/p' filename| sed -r "s/^\s+//g"| sed -r "s/\(MCLK\)//g"

800 MHz 

相关内容