使用 sed 删除直到第一次出现冒号

使用 sed 删除直到第一次出现冒号

我的 sed 命令是

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

它必须返回,

bcde:cdeaf

(即)必须删除该行中第一个冒号之前的所有字符以及冒号本身。

但这并没有消除任何东西。

我的困惑主要是由于,

1)用于模式匹配的括号是否需要在 sed regex-es 内转义?

2)在任何一种情况下(有转义/无转义),它都不起作用。我试过,

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'

答案1

d中的命令删除sed整行。这里要使用的是一个s(替换)命令。

$ echo 'abcd:bcde:cdeaf' | sed 's/[^:]*://'
bcde:cdeaf

[^:]就是如何写“不是冒号”。*非冒号表达式后面的意思是“在我之前的任意数量的事物”(在本例中为非冒号)。最后,:选择一个冒号。

匹配总是以贪婪的方式从左到右发生,因此保证匹配给定字符串的第一部分,直到并包括第一个冒号。

换句话说,选择任意数量的不是冒号和第一个冒号的内容。

//将匹配的子字符串替换为空的方法(即删除它)。

答案2

要对列进行操作,有cut

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

同样做

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

和其他版本sed(对于大数据更快):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

而且颇具异域风情bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

或者

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

或者

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

相关内容