私はこのようなリストを持っています:
5678:robert dylan :d.g.m. :marketing :04/19/43 85000
その人の名前と名称だけを表示したい。そのために使いたいですsed
。どうすればいいですか?
更新:
echo "5678:robert dylan :d.g.m. :marketing :04/19/43 85000" |
sed 's/:/\n/g' | sed '1d;3d;$d'| sed 'N;s/\n/ - /'
収量
robert dylan - marketing
説明:
に基づいて行を複数の行に分割し:
、最初、3番目、最後の行を削除してから、それらを再度結合することで機能します。
注:最後の式では、の最後のセットの間に何か他のものを置くことによって、名前と指定を区別するものを指定できます/ /
'N;s/\n/ /'
以前のAWKソリューション:
そうsed
ではありませんが、awk
許容できるのであれば、これは非常に自然なツールです。
$ echo "5678:robert dylan :d.g.m. :marketing :04/19/43 85000" | awk -F":" '{print $2, $4}'
収量
robert dylan marketing
または、データが次の名前のファイルに保存されている場合data.txt
:
awk -F":" '{print $2, $4}' data.txt
同じ出力を生成します。
awkは、この種のタスクに非常に適しています。
説明:
awk -F":" '{print $2, $4}'
-F
フィールドセパレータをに設定し:
、print $2, $4
結果のフィールド2と4をそれぞれ出力します。printf
必要に応じて、出力を具体的にフォーマットするために使用できます。
を使用してソリューションにドロップすると思ったcut
cut -d ":" -f 2,4
生成:
robert dylan :marketing
これはあなたのために働くかもしれません:
echo "5678:robert dylan :d.g.m. :marketing :04/19/43 85000" |
sed 's/[^:]*:\([^:]*:\)[^:]*:\([^:]*\):.*/\1\2/'
robert dylan :marketing
説明:
代替コマンドの左側(LHS)には、次のように書かれています。
[^:]*:
0個以上:
の非'に一致し、その後に:
-これは一致します5678:
\([^:]*:\)
上記と同じですが、バックリファレンスとして記憶されます\1
-一致しますrobert dylan :
[^:]*:
上記と同じですが、後方参照はありません-一致しますd.g.m. :
\([^:]*\)
:
上記のように(ただし、バックリファレンスとして記憶されますを除く\2
-一致marketing
:.*
aに:
続いて他のすべて-一致:04/19/43 85000
代替コマンドの右側には次のように書かれています。
\1\2
左側を1番目と2番目のバックリファレンスに置き換えます。Lavonのアプローチに似ていますが、複数のレコードに適応しています
sed -n 's/:/\n/pg' file | sed -n '2~5h;4~5{H;g;s/\n/|/g;p}'
を生成します
robert dylan |marketing
penny farthing |accident & emergency
...
入力ファイル用
5678:robert dylan :d.g.m. :marketing :04/19/43 85000
8076:penny farthing :d.g.m. :accident & emergency :04/19/43 85000
...
最初に改行に置き換え:
て、\n
レコードごとに5行を取得します。次に、5行のセットごとに、2番目をコピーして4番目を保持スペースに追加し、パターンスペースに転送して\n
、セパレーター(この場合|
)に置き換えて印刷します。(列の順序を気にしない場合は{H;g;...
、に短縮できます{G;...
。)