4

私はこのようなリストを持っています:

5678:robert dylan   :d.g.m. :marketing  :04/19/43 85000

その人の名前と名称だけを表示したい。そのために使いたいですsed。どうすればいいですか?

4

4 に答える 4

8

更新

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必要に応じて、出力を具体的にフォーマットするために使用できます。

于 2012-07-07T16:17:03.650 に答える
6

を使用してソリューションにドロップすると思ったcut

 cut -d ":" -f 2,4

生成:

 robert dylan :marketing
于 2014-05-26T15:49:21.180 に答える
4

これはあなたのために働くかもしれません:

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番目のバックリファレンスに置き換えます。
于 2012-07-07T16:35:31.797 に答える
0

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;...。)

于 2020-06-07T13:35:06.693 に答える