我需要一个 sed 命令,它接受一个字符串并从开头删除第一个字符的所有副本(但不从字符串的其余部分删除)。
例如,AAABAC 应该产生 BAC,因为第一个字母是 A,所以我们从头开始删除整个 A。
我最初的想法是:
data=$(echo $data | sed 's/^.\+\(.*\)/\1/')
但这不起作用(输出空字符串)。如果我将第一个 .
替换为特定字符,它将成功地只针对该字符工作,但我无法正确地将其设置为通配符。
我认为 .
匹配我想要的第一个字符,但是 +
不记得我想要的字母并继续接受每个字符,直到字符串的末尾,以便括号不包含任何内容,因此整个字符串将被替换为任何内容。我怎样才能最初接受任何字符,然后为 +
“锁定”该字符?
最佳答案
您可以使用:
$> s='AAABAC'
$> sed -E 's/^(.)\1*//' <<< "$s"
BAC
(.)
将匹配第一个字符并将其捕获到组#1\1*
将匹配相同字符的 0 个或多个实例
或者这是一种纯 BASH 方式来做同样的事情:
$> shopt -s extglob
$> echo "${s##+(${s:0:1})}"
BAC
${s:0:1}
为我们提供了 $s
的第一个字符和 ##+(${s:0:1})
从头开始删除第一个字符的所有实例。
关于regex - 给定一个字符串,如何去除第一个字符的运行? (sed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40205939/