我正在尝试在bash脚本中创建一个正则表达式替换命令,但是在玩单引号,双引号和转义字符之后,我正在把头发拉出来。我使用RegEXR来组成模式,并提出了以下内容:

我搜索:

/\.icon-(.*) {\n\t/gm

并想将其替换为:

if(strpos(\$embedicons,'$1') !== false) { \$svgicons .= <<<'EOD'\n\.$1 {

这取代了这个:

.icon-basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

有了这个:

if(strpos($embedicons,'basket-14-icon') !== false) { $svgicons .= <<<'EOD'
.basket-14-icon {background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

但是,我在bash脚本中实现它方面非常不成功。我不确定它是否相关,但我在OSX Mavericks上并使用终端应用程序。虽然RegExr中的模式对我来说很有意义,但一旦我开始逃避它,我就完全失去了正在发生的事情的轨道。

  1. 如何确保正则表达式是全局和多行的?
  2. 使用其他选项比内置正则表达式更好吗?
  3. 网上有没有教(bash)正则表达式完成noobs的资源?
  4. 是否有一个组模式匹配所有内容(包括空白和 换行符)直到给定的字符链,如星号(*)?

显然我不是在寻找讲义,因为这个问题经常困扰着我。..我很想学习正则表达式并通过学习来解决我的问题,我在网上学习了一些例子,但它们似乎太先进了。也许有一个像RegExr这样的在线生成器翻译成bash兼容和PHP兼容版本的regex模式?


更新/解决方案:

以下似乎在OSX Mavericks终端中为我工作:

sed "s|\.icon-\(.*\) {|if(strpos(\$embedicons,'\1') !== false) { \$svgicons \.= <<<'EOD' \.\1 {|g"
有帮助吗?

解决方案

我会建议使用 sed 对于这种替换,这条线会做你想要的:

sed "s/^.icon-\(.*\) {$/if(strpos(\$embedicons,'\1') !== false) { \$svgicons .= <<<'EOD'\n.\1 {/"g input_file.txt

input_file。txt脧脗脭脴:

.icon-basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

输出:

if(strpos($embedicons,'basket-14-icon') !== false) { $svgicons .= <<<'EOD'
.basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

-r (扩展正则表达式)标志集,你只需要转义字面大括号和变量美元符号在你的例子。

关于你的问题:

  • g 国旗为 sed 使其全球化。你说的"多行"到底是什么意思"?输出换行符很容易使用 ,跨行匹配有点复杂 sed 逐行操作。一种常见的技术是用占位符替换文件/数据中的所有换行符,在考虑占位符时执行正则表达式/替换,然后再次用换行符替换占位符。
  • sed 对于正则表达式类型的东西来说,这可能是你最好的选择。你可以在网上找到文档,这是相当全面的: http://www.grymoire.com/Unix/Sed.html

对于最后一部分,使用 (.*) 将捕获所有内容,然后你只需要处理换行符,并确保你正确地转义你的终止字符串。

测试文件:

testing data with space -
and newlines /'\ *** ends
there

命令(tr 正在交换换行符为tildes并再次返回):

tr '\n' '~' < testfile | sed -r 's/(.*)\*\*\*.*/\1/g' | tr '~' '\n'

输出:

testing data with space -
and newlines /'\ 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top