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

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意味着删除每个匹配的实例。

  • 这不是我的答案。这是你的答案,编辑。就这样。它是*好的*。它不再是了。 (4认同)
  • 你不需要 `^` 锚定你的匹配,除非你还添加了一个 `g`global 标志。一个模式只能出现第 1 次,因此 `g`lobal 标志不会从一行中删除所有 `[^:]*:` 模式,如果你没有 `^`锚定它。而不是用两个不必要的标志使正则表达式复杂化,这些标志只会使彼此不平衡,您可以将它们排除在外,这是此答案的编辑版本在您回滚之前所展示的。为什么你会坚持传播我不知道的坏信息,但它使这是一个糟糕的答案。 (3认同)

Cos*_*tas 5

要使用列进行操作,有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)