sedでパターン発生のみを印刷する方法は?

sedでパターン発生のみを印刷する方法は?

私のLinuxコンピュータにはセミコロンで区切られたデータがあります。 N番目(たとえば3d)の単語を見つけて、行全体ではなく印刷する必要があります。必要なパターンを見つけ、それらの間に配置して_動作することを確認する次のスクリプトがあります。

sed 's/\;[^;]*\;/_&_/3'

この入力の例は次のとおりです。

A1a 77l;a3sSs 2 smm;AS 3N123N8j a5njs;M3Xa 4 4a 3n1J  S2a;sm i;A9S;dd d3

次のように出力されます。

A1a 77l;a3sSs 2 smm;AS 3N123N8j a5njs;M3Xa 4 4a 3n1J  S2a;sm i_;A9S;_dd d3

パターンが見つかったら、行全体ではなく単に印刷するだけで、出力は次のようになります。

A9S

答え1

sed -E 's/(([^;]*);){6}.*/\2/'

6キャプチャしたいフィールド番号はどこにありますか?

(入力のフィールド数より大きいフィールド番号を指定すると、代入なしで入力のみがエコーされます。)

私は-E拡張正規表現を有効にするこのオプションを使用しました。使用しているsedのバージョンによっては、-r使用する必要があります。または、デフォルトの正規表現を使用して括弧と中括弧をエスケープするには、このオプションをスキップします。

sed 's/\(\([^;]*\);\)\{6\}.*/\2/'

仕組み:

sed は、できるだけ早い位置で一致を探します。この場合、最初の文字から始まる一致を探します(入力に6つ以上のフィールドがあるとします)。外部角かっこ式は、フィールドの後に区切り文字が続くものと一致します;。コマンドは6これら(または指定した数字)を連続して一致させます。最後のものは.*残りの行と一致します。その結果、生産ライン全体が交換された。

何に置き換えられますか?\2内部角かっこ式(2番目の左角かっこで始まる式)を表します。内部かっこ式は実際には6回一致しますが、sedはユーザーが望む最後の一致を使用します。

より良い機能を備えたバージョン:

このバージョンは、表示されたフィールドが存在しない場合、行全体を空の文字列に置き換えます(たとえば、入力に6つ未満のフィールドがある場合など)。

sed -E 's/(([^;]*);){6}.*/\2/;t;d'

OS Xのsedバージョン(またはBSD?)では、次の2行で書く必要があるようです。

sed -E 's/(([^;]*);){6}.*/\2/;t
d'

t置換が行われると、このコマンドはこの入力行に対するsedの処理を終了します。

したがって、6番目のフィールドが存在する場合、以前と同じように置換が実行され、コマンドtはこの入力ラインの処理を終了します。ただし、6番目のフィールドが存在しない場合、sコマンドは交換を実行しないため、t分岐しません。 sedはd入力行を削除するコマンドを続行します(入力行にフィールドが6つ未満の場合)。 、それが私たちが望むものです)。

答え2

;ファイルから3番目に区切られたフィールドをインポートするには、次のようにしますcut

$ cut -d ';' -f 3 file
AS 3N123N8j a5njs

表示されたフィールドを取得するには、6番目のフィールドを切り取ります。

$ cut -d ';' -f 6 file
A9S

awkを使用してこれを行うこともできますawk -F ';' '{ print $6 }' file

の場合、置き換える必要があるため、コマンドのフラグ(数値)はsed使用できません。/nsn全体的に。これは実際に含まれていますマッチ特定の領域だけではなく、完全なスイートです。

したがって、;6番目に区切られたフィールドを取得する1つの方法は、次を使用することです。

$ sed 's/^\([^;]*;\)\{5\}\([^;]*\);.*/\2/' file
A9S

または、sed拡張正規表現をサポートする-E場合

$ sed -E 's/^([^;]*;){5}([^;]*);.*/\2/' file
A9S

つまり、それぞれ一致する 5 つのフィールド[^;]+;(各フィールドの終了を含む;)、次のフィールド、残りの行を一致させます。このアイテムをすべて目的のフィールドに置き換えます。

つまり、この操作にはcutまたはを使用する方が良いです。awk

関連情報