我有这样的文字:
LDX LEVEL
LDA INITD015,X ; INITIAL ACTIVE SPRITES
STA $D015
STA SAVED015
LDA INITXPOS,X ; INITIAL HERO X COORDINATE
STA XPOS
LDA INITYPOS,X ; INITIAL HERO Y COORDINATE
STA YPOS
LDA INITXPOSMUM,X ; INITIAL MUMMY X COORDINATE
STA XPOSMUM
LDA LEVEL
BNE NOTLOADENDELEMENTS
LDA FLAGLOSELIFE
BNE NOTLOADENDELEMENTS
; LDX #<BIGELEMENTSFILE ; LOW BYTE
; LDY #>BIGELEMENTSFILE ; HI BYTE
; JSR LOADFILE_EXOMIZER
我需要对齐从“;”开始的文本这不是一行的第一个字符,到行尾,在该行的第 41 个字符处。以“;”开头的行必须保持不变,直到(并且如果)出现第二个“;”遇到了,然后从第二个“;”开始凝视到行尾应该在字符 41 处对齐。也许第二个“;”位于字符 41 之前或之后。
使用 SED 或 AWK 可以实现这一点吗?
答案1
perl 怎么样?
perl -pe 's/^(.+?)(?=;)/$1 . " "x(41-length($1))/e' file
LDX LEVEL
LDA INITD015,X ; INITIAL ACTIVE SPRITES
STA $D015
STA SAVED015
LDA INITXPOS,X ; INITIAL HERO X COORDINATE
STA XPOS
LDA INITYPOS,X ; INITIAL HERO Y COORDINATE
STA YPOS
LDA INITXPOSMUM,X ; INITIAL MUMMY X COORDINATE
STA XPOSMUM
LDA LEVEL
BNE NOTLOADENDELEMENTS
LDA FLAGLOSELIFE
BNE NOTLOADENDELEMENTS
; LDX #<BIGELEMENTSFILE ; LOW BYTE
; LDY #>BIGELEMENTSFILE ; HI BYTE
; JSR LOADFILE_EXOMIZER
awk
awk '
(p=index(substr($0,2), ";")) > 0 {
printf "%-40s%s\n", substr($0,1,p), substr($0,p)
next
}
{print}
' file