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

yih*_*oon 41 sed

如何替换以下字符串

hd_ma_prod_customer_ro:*:123456789:john.doe
Run Code Online (Sandbox Code Playgroud)

与约翰·多伊

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

Gra*_*eme 60

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

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'
Run Code Online (Sandbox Code Playgroud)

解释:

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

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

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


Ram*_*esh 7

sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Run Code Online (Sandbox Code Playgroud)

我将所有出现的:替换为一个选项卡,然后使用它awk来提取字符串 john.doe。

如果你没有文件,你可以试试这个。

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'
Run Code Online (Sandbox Code Playgroud)

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

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

纳入 Graeme 的评论以摆脱不必要的 sed

该命令可以修改如下。

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

  • `awk` 的 `-F` 选项指定字段分隔符。如果您告诉 `awk` 使用冒号,则无需用制表符替换冒号。此外,如果您想获得最后一个字段,您可以使用 `$NF` 而不是 `$4`,如果不总是 3 个冒号,这将起作用。 (3认同)

Chr*_*own 6

另一种方法使用awk

awk -F: '{ print $NF }'
Run Code Online (Sandbox Code Playgroud)


小智 4

请尝试

echo 'abc:fjk' |sed 's/.*:/john.doe/g'
Run Code Online (Sandbox Code Playgroud)

并删除

echo 'abc:fjk' |sed 's/.*://g'
Run Code Online (Sandbox Code Playgroud)