如何在特定单词之后交换单词,该单词可以插入一行,也可以使用SED在不同的行中



i有一个文件开始的文件:

OCCUPY 12 EVERY PIC 32(12).     SUNNY 
OCCUPY 45 EVERY PIC X(21).      SUNNY

,有些线可以分为两行:

1      OCCUPY 12 EVERY PIC 32(12).    SUNNY
2              OCCUPY 45 EVERY        SUNNY 
3                   PIC X(21).        SUNNY

和所需的输出为:

PIC 32(12) OCCUPY 12 EVERY.    SUNNY
PIC X(21) OCCUPY 45 EVERY.     SUNNY 

所以,我需要将分离的线路带入一行并交换单词。因此,对于一排中的那些,我正在使用命令:

sed 's/(OCCUPY.*EVERY) *(PIC *[^ }*)./2 1./'
sed -Ez 's/(OCCUPY)s+([0-9]+)s+(EVERY)s+(PIC)s+([^)]+))/4 5 1 2 3/g'

这些命令正常工作,但是只有该线路在一行中,并且它也会移动sunny一词,而点是一个空间。Sunny一词必须在同一领域。因此,不正确的输出为:

PIC 32(12) OCCUPY 12 EVERY.     SUNNY
PIC X(21) OCCUPY 45 EVERY .   SUNNY 

任何帮助将不胜感激!

with gnu sed for -E-zs shorthand for [[:space:]]

$ sed -Ez 's/(OCCUPYs+[0-9]+s+EVERY)s+(PICs+[^)]+))/2 1/g' file
PIC 32(12) OCCUPY 12 EVERY.
PIC X(21) OCCUPY 45 EVERY.

,如果每行都符合空间/非空间字符串的模式,则可以将其降低到:

$ sed -Ez 's/((S+s+){2}S+)s+(S+s+S+))/3 1/g' file
PIC 32(12) OCCUPY 12 EVERY.
PIC X(21) OCCUPY 45 EVERY.

,或者如果可以在任何空白空间中分开该行,而不仅仅是您的示例中显示的位置:

$ sed -Ez 's/(OCCUPY)s+([0-9]+)s+(EVERY)s+(PIC)s+([^)]+))/4 5 1 2 3/g' file
PIC 32(12) OCCUPY 12 EVERY.
PIC X(21) OCCUPY 45 EVERY.
$ sed -Ez 's/(S+)s+(S+)s+(S+)s+(S+)s+(S+))/4 5 1 2 3/g' file
PIC 32(12) OCCUPY 12 EVERY.
PIC X(21) OCCUPY 45 EVERY.

给定您更新的输入/输出脚本仍然有效:

$ cat file
OCCUPY 12 EVERY PIC 32(12).     SUNNY
OCCUPY 45 EVERY
        PIC X(21).      SUNNY
$ sed -Ez 's/(OCCUPYs+[0-9]+s+EVERY)s+(PICs+[^)]+))/2 1/g' file
PIC 32(12) OCCUPY 12 EVERY.     SUNNY
PIC X(21) OCCUPY 45 EVERY.      SUNNY
$ sed -Ez 's/((S+s+){2}S+)s+(S+s+S+))/3 1/g' file
PIC 32(12) OCCUPY 12 EVERY.     SUNNY
PIC X(21) OCCUPY 45 EVERY.      SUNNY
$ sed -Ez 's/(OCCUPY)s+([0-9]+)s+(EVERY)s+(PIC)s+([^)]+))/4 5 1 2 3/g' file
PIC 32(12) OCCUPY 12 EVERY.     SUNNY
PIC X(21) OCCUPY 45 EVERY.      SUNNY
$ sed -Ez 's/(S+)s+(S+)s+(S+)s+(S+)s+(S+))/4 5 1 2 3/g' file
PIC 32(12) OCCUPY 12 EVERY.     SUNNY
PIC X(21) OCCUPY 45 EVERY.      SUNNY

这可能对您有用(gnu sed(:

sed -E '/OCCUPY/{:a;/ PIC/!{N;s/ns*//;ta};s/PIC/n&/;s/(.*) n([^.]*)/2 1/}' file

这重点是包含OCCUPY的行,然后如果同一行也不包含PIC,则附加了其他行(删除其新线(,直到它为止。

使用引入的newline作为定界符,然后使用模式匹配将模式空间中的线重新安排到所需格式。

相关内容

最新更新