[英]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.