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
, -z
和 s
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作为定界符,然后使用模式匹配将模式空间中的线重新安排到所需格式。