我想知道是否有可能编写一个100%可靠的sed命令来转义输入字符串中的任何正则表达式元字符,以便它可以在后续的sed命令中使用.像这样:
#!/bin/bash
# Trying to replace one regex by another in an input file with sed
search="/abc\n\t[a-z]\+\([^ ]\)\{2,3\}\3"
replace="/xyz\n\t[0-9]\+\([^ ]\)\{2,3\}\3"
# Sanitize input
search=$(sed 'script to escape' <<< "$search")
replace=$(sed 'script to escape' <<< "$replace")
# Use it in a sed command
sed "s/$search/$replace/" input
Run Code Online (Sandbox Code Playgroud)
我知道有更好的工具可以使用固定字符串而不是模式,例如awk,perl或python.我想证明是否有可能sed.我会说让我们专注于基本的POSIX正则表达式,以获得更多乐趣!:)
我已经尝试了很多东西,但任何时候我都能找到一个打破了我的尝试的输入.我认为保持它是抽象的,因为script to escape不会导致任何人走错方向.
顺便说一下,讨论在这里提出来了.我认为这可能是收集解决方案的好地方,可能会破坏和/或详细说明.
我想清理一些输入并用可接受的输入替换几个字符,例如丹麦语å"with with aa".
这是很容易使用若干语句进行,例如/æ/ae/,/å/aa/,/ø/oe/,但由于工具的限制,我希望能够做到这一点在一个单一的正则表达式.
我可以捕获所有相关的情况(/[(æ)(ø)(å)(Æ)(Ø)(Å)]/)但我更换不能按我的意愿工作(但可能完全按照预期):
$ temp="RødgrØd med flæsk"
$ echo $temp
RødgrØd med flæsk
$ echo $temp | sed 's/[(æ)(ø)(å)(Æ)(Ø)(Å)]/(ae)(oe)(aa)(Ae)(Oe)(Aa)/g'
R(ae)(oe)(aa)(Ae)(Oe)(Aa)dgr(ae)(oe)(aa)(Ae)(Oe)(Aa)d med fl(ae)(oe)(aa)(Ae)(Oe)(Aa)sk
Run Code Online (Sandbox Code Playgroud)
(第一个回声线是为了表明它不是编码问题)
另外,工具问题是我还想在Sublime Text 2片段中使用相同的正则表达式.
有谁能辨别我的正则表达式语句有什么问题?
提前致谢.
我发现脚本成瘾者加入 raku 的一个巨大卖点就是拥有这样的结构
my $w = "Hello world";
$w
~~ s/Hello/Hola/
~~ s/world/mundo/
;
say $w; # » Hola world
Run Code Online (Sandbox Code Playgroud)
但是我似乎无法写出这样的东西。据我所知,用 的.subst方法做这件事Str太丑了,这种连锁
s///甚至tr///基本上也将成为sed用户等的入门药物。
我的问题是我是否遗漏了某些东西,如果在 raku 中以某种方式可能会出现与此类似的东西。我不是初学者,我无法弄清楚。