使用 sed 去除字符串末尾的单词模式

使用 sed 去除字符串末尾的单词模式

我有以下字符串:

ksh -x SCRIPT2.ksh $BUSSINESSDATE & PID=$!; ksh -x SCRIPT1.ksh $BUSSINESSDATE & PID=$!;

我想把最后一个字去掉& PID=$!;。期望的结果是:

ksh -x SCRIPT2.ksh $BUSSINESSDATE & PID=$!; ksh -x SCRIPT1.ksh $BUSSINESSDATE

笔记& PID=$!;:我确实在字符串中间有,我只需要去掉最后一个包含的单词& PID=$!;

我正在使用sed实现这个。但它似乎没有产生预期的输出。

sed 's/\(\& PID=\$\!\).*$//'

答案1

sed -e 's/& PID=\$\!;$//'

$末端将其固定在绳子的末端。

答案2

到目前为止,所有答案都很好,但对于这个具体示例,您可以节省时间并少写几个字符:

sed 's/ & [^ ]*$//'

甚至更好

sed 's/ & \S*$//'

答案3

要删除线上最后一次出现的模式,只需挤压它即可。

sed 's/\(.*\)& PID=$!;/\1/'

这将在匹配字符串之前尽可能多地匹配\1,因此它总是仅删除最后一个匹配项 - 无论您删除的字符串实际上是否位于行尾。

您的尝试:

 sed 's/\(\& PID=\$\!\).*$//'

...做相反的事情。它会删除一行中从第一次出现的字符串开始一直到该行末尾的所有字符。

记住最左边最长规则 - 正则表达式将始终尽可能从字符串的左侧开始匹配,并尽可能长时间地继续匹配。


请注意,如果您只想删除n最后一个字符,则使用 gnused

sed -E 's/.{9}$//'

-E要使用扩展正则表达式,必须使用此选项。

相关内容