如何使用Sed替换冒号前的所有字符?


25

如何替换以下字符串

hd_ma_prod_customer_ro:*:123456789:john.doe

和john.doe

基本上,我需要查找最后一个冒号(:)并删除之前(包括它)的所有内容。

Answers:


40

假设您的实际意思是要删除所有内容,直到最后一个冒号并john.doe保持原样:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

说明:

第一行只是通过管道将测试字符串传送到sed示例中。

第二个是基本sed替代。第一个和第二个之间的部分/是要搜索的正则表达式,第二个和第三个之间的部分是要替换的内容(在这种情况下,我们将删除任何内容)。

对于正则表达式,.匹配任何字符,*重复此次数任意次(包括零)并:匹配冒号。如此有效的是冒号后面紧跟的任何东西。由于.*可以包含冒号,因此匹配为“贪婪”,并且包括最后一个冒号之前的所有内容。


7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

我用选项卡替换了所有出现的,然后用于提取字符串john.doe。awk

如果没有文件,可以尝试此操作。

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

根据Graeme的评论,我们可以使用如下变量awk单独打印最后一列。NFawk

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

结合Graeme的评论来摆脱不必要的 sed

该命令可以如下修改。

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'

1
如果要使用awk,为什么不做awk -F:呢?
Graeme 2014年

@Graeme,我还是不太满意awk。基本上,我尝试测试我最初从答案中获得的命令,并尝试根据用户要求对其进行修改。:)
Ramesh 2014年

3
-F对选项awk指定字段分隔符。如果您告诉awk您使用冒号,则无需用制表符替换冒号。另外,如果您想获取最后一个可以$NF代替的字段$4,则可以在不总是3个冒号的情况下使用。
Graeme

@Graeme,我已将您提到的更改纳入其中。请让我知道这是否还好:)
Ramesh 2014年

是的,效果很好!
Graeme 2014年


2

请试试

编辑:删除锚

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

并删除

echo 'abc:fjk' |sed 's/.*://g'

这不是OP所要求的
iruvar

请重新阅读该问题。
akash 2014年

好吧,在我发表评论后,您偷偷删除了,没关系
iruvar

哦,我懂了 。我的道歉1_CR
akash

1
^在问题的案例或示例案例中,锚都没有影响。以开头的任何地址都/.*已经包含^
mikeserv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.