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

解释:

工作原理是根据 将行拆分为多行:,删除第一行、第三行和最后一行,然后再次将它们连接起来。

注意:在最后一个表达式中,您可以通过在最后一组in之间放置其他内容来指定将名称与指定分开的内容/ /'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) 表示:

  • [^:]*:匹配零个或多个 non:后跟 a :- 这匹配5678:
  • \([^:]*:\)如上所述,但将被记住为反向引用\1- 匹配robert dylan :
  • [^:]*:如上所述,但没有反向引用 - 匹配d.g.m. :
  • \([^:]*\)如上所述(除了:but 将被记住为反向引用\2- 匹配marketing
  • :.*a:后跟其他所有内容 - 匹配:04/19/43 85000

替换命令的右侧说:

  • \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 回答