繁体   English   中英

用sed替换第一个匹配项

[英]Replace the first occurrence with sed

如下例所示,我只想保留第一个 “ John”之前的单词。

但是,我采用的模式似乎从头到尾都取代了约翰。 因此,我需要两次调用sed。

我如何找到正确的方法?

PATTERN="I am John, you are John also"
OUTPUT=$( echo "$PATTERN" | sed -r "s/(^.*)([ \t]*John[ ,\t]*)(.*$)/\1/" )
echo "$OUTPUT"
OUTPUT=$( echo "$OUTPUT" | sed -r "s/(^.*)([ \t]*John[ ,\t]*)(.*$)/\1/" )
echo "$OUTPUT"

我的期望只有一次。 由于如果“约翰”出现几次,将是一个麻烦。

通过上述过程,它将生成如下输出:

首先,它匹配并修饰了最终约翰后的单词; 然后是第一个约翰。

我是约翰,你是

我是

我想执行一次并得到

我是

使用sed可能会帮助您。

echo "I am John, you are John also" | sed 's/ John.*//'

或带有变量。

pattern="I am John, you are John also"
output=$(echo "$pattern" | sed 's/John.*//')

另一种方法是在Perl模式下使用grep命令:

echo "I am John, you are John also" | grep -oP '^(?:(?!John).)*';
I am 
#there will be a space at the end
echo "I am John, you are John also" | grep -oP '^(?:(?!John).)*(?=\s)';
I am
#there is no space at the end

正则表达式说明:

^(?:(?!John).)*

这将从行首开始接受所有字符,直到到达第一个John为止。

正则表达式演示

Awk解决方案:

s="I am John, you are John also and there is another John there"
awk '{ sub(/[[:space:]]+John.*/, "") }1' <<<"$s"

输出:

I am

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM