私の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
使用できません。/n
s
n
全体的に。これは実際に含まれていますマッチ特定の領域だけではなく、完全なスイートです。
したがって、;
6番目に区切られたフィールドを取得する1つの方法は、次を使用することです。
$ sed 's/^\([^;]*;\)\{5\}\([^;]*\);.*/\2/' file
A9S
または、sed
拡張正規表現をサポートする-E
場合
$ sed -E 's/^([^;]*;){5}([^;]*);.*/\2/' file
A9S
つまり、それぞれ一致する 5 つのフィールド[^;]+;
(各フィールドの終了を含む;
)、次のフィールド、残りの行を一致させます。このアイテムをすべて目的のフィールドに置き換えます。
つまり、この操作にはcut
またはを使用する方が良いです。awk