我有一个这样的列表:
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
解释:
工作原理是根据 将行拆分为多行:,删除第一行、第三行和最后一行,然后再次将它们连接起来。
注意:在最后一个表达式中,您可以通过在最后一组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需要使用特定格式输出。
只是想我会使用解决方案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) 表示:
[^:]*:匹配零个或多个 non:后跟 a :- 这匹配5678:\([^:]*:\)如上所述,但将被记住为反向引用\1- 匹配robert dylan :[^:]*:如上所述,但没有反向引用 - 匹配d.g.m. :\([^:]*\)如上所述(除了:but 将被记住为反向引用\2- 匹配marketing:.*a:后跟其他所有内容 - 匹配:04/19/43 85000替换命令的右侧说:
\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;...。)