在 Shell 中搜索和替换
我正在编写一个 shell (bash) 脚本,并试图找到一种简单的方法来完成一项简单的任务。
我的变量中有一些字符串。 我不知道这是否相关,但它可以包含空格、换行符,因为实际上这个字符串是整个文本文件的内容。
我想用其他内容替换最后一次出现的某个子字符串。 也许我可以使用正则表达式来实现这一点,但有两个时刻让我感到困惑:
- 我需要从末尾开始匹配,而不是从头开始匹配
- 我想要扫描的子字符串是固定的,而不是可变的。
I am writing a shell (bash) script and I'm trying to figure out an easy way to accomplish a simple task.
I have some string in a variable.
I don't know if this is relevant, but it can contain spaces, newlines, because actually this string is the content of a whole text file.
I want to replace the last occurence of a certain substring with something else.
Perhaps I could use a regexp for that, but there are two moments that confuse me:
- I need to match from the end, not from the start
- the substring that I want to scan for is fixed, not variable.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
${var#pattern}
${var%pattern}
${var/pattern/repl}
对于一般替换,模式是“文件名”样式扩展,最后一个可以以
#
或%
为前缀,以仅在开头或结尾(分别)进行匹配全部都在(长)bash 联机帮助页中。 查看“参数扩展”章节。
${var#pattern}
${var%pattern}
${var/pattern/repl}
for general replacementthe patterns are 'filename' style expansion, and the last one can be prefixed with
#
or%
to match only at the start or end (respectively)it's all in the (long) bash manpage. check the "Parameter Expansion" chapter.
像这样的 amn 表达式
应该可以解决问题 - s 代表替换,/ 分解命令,$ 是行尾标记。 您可以在 vi 中尝试一下,看看它是否满足您的需要。
amn expression like this
should do the trick - s is for sustitute, / break up the command, and the $ is the end of line marker. You can try this in vi to see if it does what you need.
我会查找 awk 或 sed 的手册页。
I would look up the man pages for awk or sed.
哈维尔的答案是特定于 shell 的,并不适用于所有 shell。
MrTelly 和 epochwolf 提到的 sed 答案是不完整的,应该看起来像这样:
无需使用 $ 来标记结束即可工作的原因是第一个 '.*' 是贪婪的,并且会尝试收集尽可能多的内容尽可能的同时允许正则表达式的其余部分为真。
这个 sed 命令应该在任何使用的 shell 上下文中都能正常工作。
Javier's answer is shell specific and won't work in all shells.
The sed answers that MrTelly and epochwolf alluded to are incomplete and should look something like this:
The reason this works without having to use the $ to mark the end is that the first '.*' is greedy and will attempt to gather up as much as possible while allowing the rest of the regular expression to be true.
This sed command should work fine in any shell context used.
通常,当我遇到 Sed 问题时,我会使用此页面,
http://sed.sourceforge.net/sed1line。文本
Usually when I get stuck with Sed I use this page,
http://sed.sourceforge.net/sed1line.txt