18 sed
我的 sed 命令是,
sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'
Run Code Online (Sandbox Code Playgroud)
它必须返回,
bcde:cdeaf
Run Code Online (Sandbox Code Playgroud)
(即) 行中第一个冒号之前的所有字符和冒号本身必须被删除。
但这并没有消除任何东西。
我的困惑主要是由于,
1) 模式匹配的括号是否需要在 sed regex-es 中转义?
2)在任何一种情况下(有转义/没有转义),它都不起作用。我试过,
sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
Run Code Online (Sandbox Code Playgroud)
use*_*828 30
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf
Run Code Online (Sandbox Code Playgroud)
第一个^
表示行的开头。这[^:]
只是我知道如何写而不是冒号的唯一方法。在*
冒号后意味着我前右任意数量的东西(在这种情况下,没有冒号)。最后,:
选择冒号。
换句话说,选择该行的开头、任意数量的非冒号和第一个冒号。
这//g
意味着删除每个匹配的实例。
要使用列进行操作,有cut
:
echo 'abcd:bcde:cdeaf' | cut -d: -f2-
Run Code Online (Sandbox Code Playgroud)
同样做
echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement
Run Code Online (Sandbox Code Playgroud)
和其他版本sed
(对于大数据更快):
echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'
Run Code Online (Sandbox Code Playgroud)
而且相当异国情调 bash
echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }
Run Code Online (Sandbox Code Playgroud)
或者
echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }
Run Code Online (Sandbox Code Playgroud)
或者
echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}
Run Code Online (Sandbox Code Playgroud)