特定のパターンを除くすべてを sed -e 's///' する方法は?

特定のパターンを除くすべてを sed -e 's///' する方法は?

文字列のすべての内容(%と直後の数字を除く)をsedに置き換えるにはどうすればよいですか?つまり、文字列を除くすべて:

%1 %1000 %55 など。

次の形式の文字列が提供されます。

    1: [18x14] [history 1/2000, 268 bytes] %3
    2: [18x14] [history 1/2000, 268 bytes] %4 (active)

%3私は部品だけを取得したいと思います%4。数は最大です999

ベストアンサー1

$ sed 's/^.*\(%[0-9]\+\).*$/\1/' input

行にこれらのタグの最大1つが含まれ、%123すべての行にこれらのタグが含まれているとします。

メタ文字\( \)は一致グループを表示します。\1対応する一致グループは、逆参照を介して代替項目で参照されます。^/$は行の始まり/終わりと一致します。

それ以外の場合は、次のように入力を事前にフィルタリングできます。

$ grep '%[0-9]\+' input | sed 's/^.*\(%[0-9]\+\).*$/\1/'

(すべての行に対応するタグが含まれていない場合)

別の変形:

$ sed 's/\(%[0-9]\+\)/\n\1\n/g' | grep '%[0-9]'

(行に複数のタグを含めることができる場合)

以下は、パイプラインの最初の部分で各タグの直前と後ろに挿入された改行です。その後、そのgrepセクションは表示されていないすべての%123行を削除します。

おすすめ記事