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

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

如何替换以下字符串

hd_ma_prod_customer_ro:*:123456789:john.doe

与约翰·多伊

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

答案1

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

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

解释:

第一行只是通过管道将测试字符串用于sed示例目的。

第二个是基础sed代换。第一个和第二个之间的部分/是要搜索的正则表达式,第二个和第三个之间的部分是要替换的内容(在本例中没有任何内容,因为我们正在删除)。

对于正则表达式,.匹配任何字符,*重复任意次数(包括零次)并:匹配冒号。因此,它实际上是后面跟着冒号的任何内容。由于.*可以包含冒号,因此匹配是“贪婪”的,并且包含直到最后一个冒号的所有内容。

答案2

另一种方法使用awk

awk -F: '{ print $NF }'

答案3

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

我正在替换所有出现的:与一个标签然后使用awk提取字符串 john.doe。

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

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}'

合并格雷姆的评论以消除不必要的sed

该命令可以修改如下。

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

答案4

请尝试

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

并删除

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

相关内容