複数のパターンを角かっこで置き換え、他のパターンをタブに置き換えます。

複数のパターンを角かっこで置き換え、他のパターンをタブに置き換えます。

次の行を含むテキストファイルがあります。

[...]
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(参照。単純なsedタブの交換が奇妙に失敗する)を修正する必要があります。

何が問題なのでしょうか?

答え1

あなたが持っている場合pgrep

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

答え2

xargs入力を取得し、指定されたコマンドの引数に変換します。grep興味のある行を返し、ファイル名を期待するコマンドにその行を引数としてxargs追加します。まったくそうする必要はありませんsedxargs

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 

関連情報