Bash 用sed替换较大部分中某个部分中的单词?

Bash 用sed替换较大部分中某个部分中的单词?,bash,sed,Bash,Sed,我意识到sed可以在多条线路上进行模式匹配。是否可以替换这些多行中某一部分内的单词?例如 file begins random line >>starting line block random line random line ..... >>replace from here hello hi there hello >>stop replacing here more random st

我意识到sed可以在多条线路上进行模式匹配。是否可以替换这些多行中某一部分内的单词?例如

file begins
random line
>>starting line block
    random line
    random line
    .....
    >>replace from here
     hello
     hi there hello
    >>stop replacing here
    more random stuff
>>finishing line block 
more random lines
file ends
假设我想将“hello”替换为“bye”,但仅在“从此处替换”到“此处停止替换”之间,并且仅在“起始线块”到“结束线块”之间。是否可以使用sed就地执行此操作?e、 g


sed'/starting line block/,/finishing line block//replace from here/,/stop replace here/s/hello/bye/g/”
您可以使用块进行此操作,如以下
sed
脚本所示:

/start/,/end/ {
    /from/,/to/s/foo/bar/g
}
使用sed-f“$file”运行它

{}
括号界定了一个命令块,
/start/,/end/
是命令将要运行的行的范围。在本例中,我们有一个命令,
s/foo/bar/g
,我们为每个块中
/from/,/to/
范围内的每一行运行该命令

上述操作将在带有
from
to
分隔符的行上运行
s/foo/bar/g
。我想那应该没问题

如果多个行范围匹配
/start/、/end/
/from/、/to/
,则此选项也有效

以下一个班轮也适用于GNU和(至少一个)BSD
sed
。POSIX没有指定
用于分隔命令,并且希望在结束
}
()之前有一个换行符,因此它的可移植性可能会降低

sed '/start/,/end/{/from/,/to/s/foo/bar/g;}' "$file"

如果像一些人在评论中指出的那样解析XML或HTML,那么应该小心。有一个答案似乎很有名,不过也有很多。实用主义最终可能会胜出,这取决于您的需求和输入数据,尤其是一次性数据。

您是否阅读了这里所有关于实用主义的帖子“不要使用
sed
解析
XML
?我想你在尝试同样的事情
awk
可以很容易地完成您指定的任务,但您可能会遇到需要额外照顾的情况。祝你好运。这可能是值得一看的东西。否则搜索
[awk]xml
做得很好;要使BSD
sed
快乐,您需要一个
结束前
}
@mklement0:谢谢!是的,干得好。请您添加
sed--版本的输出;uname-srv
?(我认为这不适用于Sun或AIX)。祝大家好运。@Sheller:这是GNU sed 4.2.2。命令块由POSIX指定(请参阅),但从快速查看来看,它似乎不支持
用于分隔命令(它需要换行符),并且在结束前需要换行符
}
。使用一个单独的脚本文件并将其与
sed-f
一起传递可能会更干净。如果你能访问其他系统,那么知道一行程序是否能在这些系统上工作将是一件很有趣的事情。@Sheller:我在答案中添加了我认为应该是非常便携的版本。