私の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つ未満の場合)。 、それが私たちが望むものです)。