4

我想转换“;”的每次出现添加到“@”中,但仅当它没有引号时(放弃此行中的引号)。背后的原因:

arm-asm的汇编语言语法有“;”作为注释符号以及“;”之后的所有内容是一条注释。尽管有“;”之类的东西或“;”。

我建议使用以下“sed”脚本作为解决方案,并希望将其付诸讨论,以防我忽略了某些内容:

文件s:

s/^\([^(;“)]*\)\(;\)\[.*$\)/\1@\3/

文件测试用例:

;;;**************';'";"';'";"ABC r1,';'ABC r1,“;”; ";" ';';;;

用法:

$sed-f s测试用例@@@**********;****';'";"';'";"ABC r1,';'ABC r1,“;”@ ";" ';'@;;

我发现例如。

.包括“stm32f407.s”;目标寄存器定义.设置PLLP,(DIVP-2)/2;其他一些评论

没有通过测试。


因此,希望现在能做到这一点:

#!/垃圾桶/桶sed-e“s/^\([^(;“)]*\)\(;\)\

警告:脚本适用于BSD公司sed(例如。,macOS操作系统),不是GNU sed。

1

2个答案2

重置为默认值

使用Perl(如果Perl解释器可用,那么它比sed更具可移植性)

perl-pe的/(?:\x27;\x27|“;”)(*SKIP)(*F)|;/@/'
  • (?:\x27;\x27|“;”)(*SKIP)(*F)任何符合要求的文本(?:\x27;\x27|“;”)不会更改,\x27像素是十六进制格式的单引号
  • |;指定作为备选方案应更改的内容
  • 使用标记是否要替换所有此类事件
  • 使用perl-i.bkp如果你想就地编辑(只是-我如果您不需要备份)
1

这可能适合您(GNU sed):

sed-E's/([“'\'']);\1/\1\n\1/g;s/;/@/;y/\n/;/'文件

全部替换;在引号或双引号之间,使用换行符。

替换第一次出现的;具有@

将所有换行替换为;.

注意:要替换所有事件,请使用:

sed-E的/([“\”]);\1/\1\n\1/g;y/;/@/;y/\n/;/'文件

此解决方案可能适用于所有sed版本:

sed-Ee’G:as/([“‘’’]);(\1.*(.))/\1\3\2/助教s//@/:bs/(.)(.*\1)$/\2/结核s/.$//'文件

它使用了一个空的保留空间附加一个换行符的事实,即G公司命令附加一个换行符,可以捕获该换行符并在替换中使用。

  • 谢谢,但你的例子都不管用。他们应该离开;在引号或双引号中,无论如何都不动;已经在评论中了。 2020年10月15日11:57
  • @Krischu你在使用GNU sed吗?
    – 波洞
    2020年10月15日12:25
  • 我正在使用macOS(OpenBSD)sed。谢谢。您的脚本在使用GNU sed时都能工作(在UBUNTU下都试过了) 2020年10月15日12:46

你的答案

点击“发布您的答案”,即表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.