0

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

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

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

4

2 回答 2

1

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

$ 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%

换行符仍然是一个问题,但是无论如何您都不想将它们保留在 bash 环境变量中,因为空格在那里不是很稳定。

于 2011-11-01T19:19:48.870 回答
0

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

  • 将替换存储到另一个文件
  • 用ed打开文件
  • 将指针移动到位置
  • 删除行(假替换如下)
  • 从文件中加载文本r FILE
  • 写和退出
于 2011-11-04T17:35:56.453 回答