私はこのようなリストを持っています:
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;...。)