sed替换文件中特定字符串的结尾

时间:2014-01-13 20:27:36

标签: bash replace sed

我的哈希文件采用以下形式:

SHA1(disk.iso)= 43798473890473280573920473902472083947320

我需要用新哈希替换旧哈希。

我一直试图修改一些旧代码而没有运气:

sed -i 's/SHA1(disk.iso)"[^+]*"/"'" $HASH"'"/' manifest

这里有什么想法吗?

*更新*

上面列出的刺痛是正确的:

SHA1(disk.iso)=(这里有一些SHA1哈希。注意等号后的空格。)

以下是当前代码:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/" manifest

但仍然没有。这不会修改有问题的行。

*解决方案*

这项工作:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/" manifest

我的文件名错了。谢谢Janos

3 个答案:

答案 0 :(得分:2)

你走了:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/" manifest

那是:

  • \(...\)内捕获文件名,并将该行的其余部分与.*
  • 匹配
  • 将模式(整行)替换为捕获的文件名\1,并附加$HASH
  • 双引号内的全部内容,以便扩展shell变量。

这是另一种做同样事情的变体:

sed -i "/^SHA1(disk.iso)/ s/=.*/= $HASH/" manifest

那是:

  • 对于以SHA1(disk.iso)
  • 开头的行
  • 使用=
  • 替换= $HASH符号及其后的所有内容

答案 1 :(得分:1)

你正规表达似乎很奇怪。 你使用很多引号。

你可以这样做(如果你现在是哈希):

sed -i "s/$OLDHASH/$NEWHASH" manifest

如果您不了解它们并且只想用SHA1(disk.iso)替换任何一行, 你可以写:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/"

\(\)这里的意思是反向引用;这意味着您将该行保存在寄存器中,稍后将使用\1使用该行。当然,你可以直接写:

sed -i "s/SHA1(disk.iso)=.*/SHA1(disk.iso) $HASH/"

但在这种情况下,不可能写出像[123] .iso这样的东西 一次匹配多个ISO。

答案 2 :(得分:1)

两个步骤:

  1. 找到合适的行
  2. 用新号码替换该行中的号码
  3. 通常使用

    执行此操作
    cat myHashFile.txt | sed '/SHA1(disk.iso)/  {s/\d+/'$HASH'/}' > newHashFile.txt
    

    /.../中的第一项通常采用正则表达式“将符合条件的行应用于符合此条件的行”

    {..}中的第二部分是命令:

    s     substitute
    \d    any digit
    \d+   one or more digits (greedy)
    $HASH replace with the contents of the $HASH variable