我的 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 ;}