【问题标题】:Use the contents of a file to replace a string using SED使用 SED 使用文件的内容替换字符串
【发布时间】:2011-10-11 01:30:26
【问题描述】:

什么是 mac shell 脚本的 sed 命令,它将用 myFile.txt 的整个字符串内容替换字符串“fox”的所有迭代。

myFile.txt 将是带有换行符和各种字符的 html 内容。一个例子是

    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>

谢谢!

编辑 1

这是我的实际代码:

sed -i.bkp  '/Q/{
s/Q//g
r /Users/ericbrotto/Desktop/question.txt
}' $file

当我运行它时,我得到:

sed in place editing only works for regular files. 

在我的文件中,Q 被大量汉字(!)替换。奇怪!

【问题讨论】:

  • stackoverflow.com/questions/6684487/…。这将是一种解决方案。祝你好运。
  • 关于编辑 1... 您可以使用扩展名为 .bkp 的原始文件。您的question.txt 文件的内容是什么?另外,$file 引用的文件的内容是什么。有二进制文件吗?它们的编码是什么?
  • question.txt文件的内容就是上面显示的html。 $file 引用的文件是 .txt 文件。我的 .bkp 部分有问题吗?我应该将其更改为 .txt 吗?我现在将检查我的 question.txt 文件的编码。
  • 您的-i.bkp 标志没有问题。 sed 消息让我怀疑它是输入文件真正的文本文件,这是一个编码问题。 可能您正在迭代某些文件,而某些二进制文件只是意外地出现在列表中。无论如何,我会期待更多关于这个问题的意见:)

标签: bash unix shell sed terminal


【解决方案1】:

最终我所采用的比我在网上找到的许多解决方案要简单得多:

str=xxxx
sed -e "/$str/r FileB" -e "/$str/d" FileA

支持这样的模板:

str=xxxx
sed -e "/$str/r $fileToInsert" -e "/$str/d" $fileToModify

【讨论】:

  • 这在匹配的 str 不是全部在单行的情况下不起作用。这将用 fileToInsert 的内容替换整行,即使字符串的一部分匹配
  • 确实,知道如何改进吗?
  • 我最终得到:KEY=$(cat /app/certs/firestore-stt.pem); awk -v file="$KEY" 'BEGIN{}/\{PRIVATE_KEY\}/{gsub("\{PRIVATE_KEY\}",file)}1' storeKey.json > temp.txt && mv temp.txt fstoreKey. json 。可能是可以改进的,但可以为带有换行符的 pem 文件完成这项工作(因为带有 r 选项的 sed 总是替换整行)。
【解决方案2】:

您可以使用r 命令。当您在输入中找到“狐狸”时...

/fox/{

...白白换掉...

    s/fox//g

...并读取输入文件:

    r f.html
}

如果你有这样的文件:

$ cat file.txt
the
quick
brown
fox
jumps
over
the lazy dog
fox dog

结果是:

$ sed '/fox/{
    s/fox//g
    r f.html
}' file.txt
the
quick
brown

    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>
jumps
over
the lazy dog
 dog
    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>

编辑:要更改正在处理的文件,只需将 -i 标志传递给 sed:

sed -i '/fox/{
    s/fox//g
    r f.html
}' file.txt

某些 sed 版本(比如我自己的)要求您将扩展名传递给 -i 标志,这将是带有文件旧内容的备份文件的扩展名:

sed -i.bkp '/fox/{
    s/fox//g
    r f.html
}' file.txt

这里和one liner是一样的,也兼容Makefile

sed -i -e '/fox/{r f.html' -e 'd}'

【讨论】:

  • 这完全有效!给这个人荣誉勋章! Brandizzi 最后一件事......这是打印到控制台,而不是文件。我们可以得到一些代码来做到这一点吗?谢谢一百万!
  • 您的结果突出了在替换开始时添加了一个额外的空白行的好奇,试图找出如何消除它。
  • 太棒了:谢谢@brandizzi。我补充说,如果模式和/或替换来自 $variables,则显然要使用双引号。还要注意correctly escape“狐狸”。
  • 你太棒了。我选择了一个班轮,但我不得不分开 d 命令(至少在 macOS 上):sed -i -e '/fox/{r f.html' -e 'd' -e '}' file.txt
  • 这会占用整行而不是我匹配的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2017-02-08
相关资源
最近更新 更多