特定のパターンを除くすべてを 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行を削除します。

答え2

grep -oこの場合は、次のものを使用することをお勧めします。

grep -oP '\B%[0-9]{1,3}\b' inputfile

これは、あなたのバージョンがgrepPerl互換正規表現(-P)をサポートしていると仮定します。それ以外の場合:

grep -o '\B%[0-9]\{1,3\}\b' inputfile

GNUを使用すると、sedスペースを改行に変換して目的の行を取得できます。

sed 'y/ /\n/' inputfile | sed '/^%[0-9]\{1,\}/!d'

答え3

以下を使用する場合は、sedほとんど常にお勧めします。

/address then/s/earch/replace/

2つの理由があります。最初のものは複数行に対してより速く、ターゲットのみをターゲットにします/addressing/探す一致するので、編集する行の一部だけを選択する必要がなくなり、結果の範囲をすばやく絞り込むことができます。

2番目の理由は、同じアドレスに対して複数の編集操作を実行できるため、操作がはるかに簡単になることです。

もちろん、この場合、表示されるデータだけを考慮すると実際の違いはありません。しかし、これはあなたが要求したことをする方法です。

sed '/^[^%]*\|[^0-9]*$/s///g' <<\DATA
    1: [18x14] [history 1/2000, 268 bytes] %3
    2: [18x14] [history 1/2000, 268 bytes] %4 (active)
DATA

#OUTPUT
%3
%4

ただすべての文字を選択してくださいいいえ - %行の先頭から始まる文字とすべての文字数字ではないアドレス行の末尾に文字を追加してからs///- を使用して削除すると、それはすべてです。

現在の形式では、行を入力すると予期しない方法でデータが破損する可能性があります。いいえ組み合わせが含まれています%digit- アドレス指定が重要な理由です。少し変更すると、次のようになります。

/%[0-9]/s/[^%]*\|[^0-9]*$//g

より安全になるそして急いで。

答え4

私の解決策は、sedを使用せずに拡張正規表現と一致のみのオプションでgrepを使用することです。


$ cat file
1: [18x14] [history 1/2000, 268 bytes] %3
2: [18x14] [history 1/2000, 268 bytes] %4 (active)
$ cat file | grep -Eo '%[0-9]+'
%3
%4

この場合、grepを使用するのはsedを使用するよりも簡単です。

関連情報