用GNU ed替换带有文本的字符串

时间:2011-11-01 18:46:36

标签: gnu ed

我想用包含每个可能字符的字符串替换%foo%(在文件测试中找到)。由于缺少字符限制,以下是不可能的(在BASHv4中执行):

echo %foo% > test
replacement="//this//is//a//test"
ed -s test <<< "g/%foo%/s/%foo%/$replacement"

知道如何用所有可能的文本替换%foo%吗?

2 个答案:

答案 0 :(得分:1)

我保证猜测你会通过每个前缀反斜杠转义斜杠和反斜杠来接近你的目标。 AFAIK无法在一步中完成bash,因此您可以编写一个函数使其可读,或者享受您的倾斜牙签森林之旅:

$ echo %foo% > test
$ replacement="//this//is//a\\\\//test"
$ echo $replacement
//this//is//a\\//test
$ stage1=${replacement//\\/\\\\}
$ echo $stage1
//this//is//a\\\\//test
$ stage2=${stage1//\//\\\/}
$ echo $stage2
\/\/this\/\/is\/\/a\\\\\/\/test
$ ed -s test <<< g/.*foo.*/s/foo/$stage2/p
%//this//is//a\\//test%

Newlines仍然存在问题,但是你不想将它们保存在bash环境变量中,因为空格不是很稳定。

答案 1 :(得分:0)

使用命令r可以从另一个文件加载文本,因此以下是有效的解决方案:

  • 将替换存储到另一个文件
  • 用ed
  • 打开文件
  • 将指针移至位置
  • 删除行(伪替换后)
  • 使用r FILE
  • 从文件加载文字
  • 写并退出