我正在编写一个 shell (bash) 脚本,并试图找出一种简单的方法来完成一项简单的任务。
我在变量中有一些字符串。我不知道这是否相关,但它可以包含空格、换行符,因为实际上这个字符串是整个文本文件的内容。
我想用其他东西替换某个子字符串的最后一次出现。也许我可以为此使用正则表达式,但有两个时刻让我感到困惑:
- 我需要从头开始匹配,而不是从头开始
- 我要扫描的子字符串是固定的,而不是可变的。
${var#pattern}
${var%pattern}
${var/pattern/repl}
一般更换模式是“文件名”样式扩展,最后一个可以在开头或结尾添加#
或匹配前缀(分别)%
这一切都在(长)bash 手册页中。检查“参数扩展”一章。
像这样的表达
s/match string here$/new string/
应该做的伎俩 - s 用于替代, / 分解命令,$ 是行尾标记。您可以在 vi 中尝试此操作,看看它是否满足您的需求。
我会查找 awk 或 sed 的手册页。
Javier 的答案是特定于 shell 的,不适用于所有 shell。
MrTelly 和 epochwolf 提到的 sed 答案不完整,应该如下所示:
MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`
无需使用 $ 来标记结尾即可工作的原因是第一个 '.*' 是贪婪的,并且会尝试尽可能多地收集,同时允许正则表达式的其余部分为真。
这个 sed 命令应该在任何使用的 shell 上下文中都能正常工作。
通常当我被 Sed 卡住时,我会使用这个页面,