Bash 如何将sed替换限制为特定符号后的所有内容?

Bash 如何将sed替换限制为特定符号后的所有内容?,bash,sed,replace,Bash,Sed,Replace,我使用sed替换文件中的各种文本,例如: sed -i "s/a/b/g" ./file.txt 我的文件中的每一行都包含,],它是一个右方括号和一个空格。我不想在这之前替换任何东西。以下是一些示例行: This is some text ] This is some other text. ^ 我放了一个胡萝卜来标记替换的开始位置。其他结束方括号可能会在该行后面出现,但不会在前面出现,例如: This is some more text ] This

我使用sed替换文件中的各种文本,例如:

sed -i "s/a/b/g" ./file.txt
我的文件中的每一行都包含,],它是一个右方括号和一个空格。我不想在这之前替换任何东西。以下是一些示例行:

This is some text ] This is some other text.
                    ^
我放了一个胡萝卜来标记替换的开始位置。其他结束方括号可能会在该行后面出现,但不会在前面出现,例如:

This is some more text ] This is yet some other text ] This is some more.
                         ^
这将取代胡萝卜之后的任何火柴。后面的方括号并不重要

如何限制sed仅替换在第一个]出现在一行之后找到的匹配项? 你可以做:

sed -i 's/^\([^]]*].*\)a/\1b/' file.txt
请注意,您使用的-i标志是非posix扩展。

您可以执行以下操作:

sed -i 's/^\([^]]*].*\)a/\1b/' file.txt

请注意,您使用的-i标志是一个非posix扩展。

到目前为止,其他答案仅在后面出现一次时替换a]。由于您使用的是g全局规范,因此我假设在结束括号之后可能会发生多次,并且您希望替换所有这些。为此,请使用分治方法

$ echo "foo abc ] bar ] baz" | sed 's/] /&\n/;h;s/.*\n//;s/a/X/g;x;s/\n.*//;G;s/\n//'
foo abc ] bXr ] bXz

<>这只会考虑第一个闭合方括号。

到目前为止,其他答案只替换A,如果它发生一次之后。由于您使用的是g全局规范,因此我假设在结束括号之后可能会发生多次,并且您希望替换所有这些。为此,请使用分治方法

$ echo "foo abc ] bar ] baz" | sed 's/] /&\n/;h;s/.*\n//;s/a/X/g;x;s/\n.*//;G;s/\n//'
foo abc ] bXr ] bXz

这只会考虑第一个闭合方括号。

+ 1:我对A+部分有一些保留;我认为这应该是一个简单的问题,因为没有任何东西可以说明右方括号不能是行中的第一个字符。i选项是基于GNU的扩展;尽管这是问题的一部分,但也应该注意到这一点。不过,这不会取代同一行中的多次出现。“您可以添加一个条件循环,但这会使事情变得有些复杂。”乔纳坦利弗勒适时地指出。我对\+部分有些保留;我认为这应该是一个简单的问题,因为没有任何东西可以说明右方括号不能是行中的第一个字符。i选项是基于GNU的扩展;尽管这是问题的一部分,但也应该注意到这一点。不过,这不会取代同一行中的多次出现。“您可以添加一个条件循环,但这会使事情变得有些复杂。”乔纳坦利弗勒适时地指出。查看我的更改。严格地说,如果在[1]之后发生一次,则您正在替换。第一个命令应为s/]/]\n/。就像您的示例是echo foo abc]bar]baz一样,您的结果将是foo abc]bar]bXz。@potong:OP声明第一个结束方括号后面有一个空格。请原谅。我应该更仔细地阅读问题,而不是摘要。严格地说,如果问题发生一次,你将替换a]。第一个命令应为s/]/]\n/。就像您的示例是echo foo abc]bar]baz一样,您的结果将是foo abc]bar]bXz。@potong:OP声明第一个结束方括号后面有一个空格。请原谅。我应该更仔细地阅读问题,而不是摘要。是在第一个]结束括号之后,还是在第一个]结束括号之后加空格?是在第一个]结束括号之后,还是在第一个]结束括号之后加空格?