1

我正在编写一个 shell (bash) 脚本,并试图找出一种简单的方法来完成一项简单的任务。

我在变量中有一些字符串。我不知道这是否相关,但它可以包含空格、换行符,因为实际上这个字符串是整个文本文件的内容。

我想用其他东西替换某个子字符串的最后一次出现。也许我可以为此使用正则表达式,但有两个时刻让我感到困惑:

  • 我需要从头开始匹配,而不是从头开始
  • 我要扫描的子字符串是固定的,而不是可变的。
4

5 回答 5

4
  • 在开始时截断:${var#pattern}
  • 最后截断${var%pattern}
  • ${var/pattern/repl}一般更换

模式是“文件名”样式扩展,最后一个可以在开头或结尾添加#或匹配前缀(分别)%

这一切都在(长)bash 手册页中。检查“参数扩展”一章。

于 2009-02-06T21:36:44.280 回答
1

像这样的表达

s/match string here$/new string/

应该做的伎俩 - s 用于替代, / 分解命令,$ 是行尾标记。您可以在 vi 中尝试此操作,看看它是否满足您的需求。

于 2009-02-06T21:36:06.747 回答
0

我会查找 awk 或 sed 的手册页。

于 2009-02-06T21:32:30.747 回答
0

Javier 的答案是特定于 shell 的,不适用于所有 shell。

MrTelly 和 epochwolf 提到的 sed 答案不完整,应该如下所示:

MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`

无需使用 $ 来标记结尾即可工作的原因是第一个 '.*' 是贪婪的,并且会尝试尽可能多地收集,同时允许正则表达式的其余部分为真。

这个 sed 命令应该在任何使用的 shell 上下文中都能正常工作。

于 2009-02-10T09:06:00.113 回答
0

通常当我被 Sed 卡住时,我会使用这个页面,

http://sed.sourceforge.net/sed1line.txt

于 2009-04-28T10:51:32.413 回答