我有一个这样的清单:
5678:robert dylan :d.g.m. :marketing :04/19/43 85000
我只想显示此人的姓名和名称。我想使用sed
。我该怎么做?
答案 0 :(得分:2)
<强>更新强>:
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
说明:
通过将行拆分为基于:
的几行,删除第一行,第三行和最后一行,然后再将它们连接起来。
注意:在最后一个表达式中,您可以通过在/ /
的最后一组中添加其他内容来指定名称与名称之间的区别{1}}
以前的AWK解决方案:
不是'N;s/\n/ /'
,但如果可以接受,则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非常适合这类任务。
解释:
awk -F":" '{print $2, $4}' data.txt
awk -F":" '{print $2, $4}'
将字段分隔符设置为-F
,:
分别打印结果字段2和4。您可以使用print $2, $4
根据需要格式化输出。
答案 1 :(得分:2)
这可能对您有用:
echo "5678:robert dylan :d.g.m. :marketing :04/19/43 85000" |
sed 's/[^:]*:\([^:]*:\)[^:]*:\([^:]*\):.*/\1\2/'
robert dylan :marketing
说明:
替代命令的左侧(LHS)表示:
[^:]*:
匹配零个或多个非:
后跟:
- 这匹配5678:
\([^:]*:\)
如上所述,但会被记住作为后方参考\1
- 匹配robert dylan :
[^:]*:
如上所述但没有后退引用 - 匹配d.g.m. :
\([^:]*\)
(:
除外,但会被记住作为后方参考\2
- 匹配marketing
:.*
一个:
后跟其他所有内容 - 匹配:04/19/43 85000
替代命令的右侧说:
\1\2
用第一个和第二个后引用替换左侧。答案 2 :(得分:1)
我想我会使用cut
cut -d ":" -f 2,4
产生:
robert dylan :marketing
答案 3 :(得分:0)
类似于Lavon's approach,但适用于多个记录
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;...
。)