【问题标题】:'sed' script to convert avr-asm to arm-gnu comments'sed' 脚本将 avr-asm 转换为 arm-gnu 注释
【发布时间】:2021-01-29 17:50:36
【问题描述】:

我想转换每次出现的 ';'到 '@' 中,但前提是它没有被引用(丢弃此行中的引号)。背后的原因:

arm-asm 的汇编语言语法有 ';'作为评论符号和';'之后的所有内容是评论。尽管有';'之类的东西或“;”。

我建议使用以下 'sed' 脚本作为解决方案,并希望对其进行讨论,以防我忽略了什么:

文件:

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

文件测试用例:

;
  ;
;**********;****
  ';'
  ";"
';'
";"
ABC r1,';'
ABC r1,";"
; ";" ';'
;;;

用法:

$ sed -f s testcase
@
  @
@**********;****
  ';'
  ";"
';'
";"
ABC r1,';'
ABC r1,";"
@ ";" ';'
@;;

我发现例如

        .include "stm32f407.s"        ; target register defines
        .set    PLLP, (DIVP - 2) / 2        ; some other comment

没有通过测试。


所以希望现在可以做到:

#!/bin/sh
sed -e "s/^\([^(;\'\")]*\)\(;\)\(.*$\)/\1@\3/" -e "s/^\([^;]*\)\(;\)\(.*\)/\1@\3/"  $1

警告:该脚本适用于 BSD sed(例如 macOS),不适用于 GNU sed。

【问题讨论】:

标签: assembly sed arm comments


【解决方案1】:

使用 Perl(如果 Perl 解释器可用,它比 sed 更便携)

perl -pe 's/(?:\x27;\x27|";")(*SKIP)(*F)|;/@/'
  • (?:\x27;\x27|";")(*SKIP)(*F) 任何满足(?:\x27;\x27|";") 的文本都不会改变,\x27 是十六进制格式的单引号
  • |; 指定应更改的内容作为备用
  • 如果要替换所有此类事件,请使用 g 标志
  • 如果您想要就地编辑,请使用 perl -i.bkp(如果您不想要备份,请使用 -i

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -E 's/(["'\'']);\1/\1\n\1/g;s/;/@/;y/\n/;/' file
    

    用换行符替换引号或双引号之间的所有;

    将第一次出现的; 替换为@

    ;替换所有换行符。

    注意要替换所有匹配项,请使用:

    sed -E 's/(["'\'']);\1/\1\n\1/g;y/;/@/;y/\n/;/' file
    

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

    sed -Ee 'G
            :a
            s/(["'\'']);(\1.*(.))/\1\3\2/
            ta 
            s/;/@/
            :b
            s/(.)(.*\1)$/;\2/
            tb 
            s/.$//' file
    

    它使用了一个空的保持空间附加一个换行符的事实,即G 命令附加一个换行符,可以捕获并用于替换。

    【讨论】:

    • 谢谢,但你的例子都不起作用。他们应该离开;在引号或双引号中无论如何都没有被触及以及;已经在 cmets 中了。
    • @Krischu 你在使用 GNU sed 吗?
    • 我使用的是 macOS (OpenBSD) sed。谢谢。您的脚本在使用 GNU sed 时都可以工作(在 UBUNTU 下都试过)
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 2016-08-26
    • 1970-01-01
    • 2018-11-09
    • 2012-10-13
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多