我有一个这样的列表:
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;...
。)