在Shell中搜索和替换

时间:2009-02-06 21:30:51

标签: bash shell sed awk textutils

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

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

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

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

5 个答案:

答案 0 :(得分:4)

  • 在开头截断:${var#pattern}
  • 最后截断${var%pattern}
  • ${var/pattern/repl}进行一般更换

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

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

答案 1 :(得分:1)

amn表达式

s/match string here$/new string/

应该做的诀窍 - s是替代,/分解命令,$是行标记的结束。您可以在vi中尝试这一点,看它是否能满足您的需求。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

MrTelly和epochwolf提到的sed答案是不完整的,应该看起来像这样:

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

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

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

答案 4 :(得分:0)

通常当我遇到Sed时,我会使用此页面,

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