shell 如何移动/复制特定的短语/模式到文本文件的另一个地方,并添加前缀/标签多次?

xpszyzbs  于 2023-03-09  发布在  Shell
关注(0)|答案(2)|浏览(134)

我有一个ics文件,里面有很多事件。想通过添加一个位置来改进一下:标签的描述部分。关于如何做到这一点有什么想法吗?我需要做一个grep/sed/awk组合或写一个python脚本来编辑它吗?添加一个新的行与一个标记第一次或同时做一个移动模式?我需要拆分文件成几个部分或只是工作在一个部分?我想过每一个n行规则,但添加一个空行打破了这一规则。下面的坏例子:

BEGIN:VEVENT
DESCRIPTION:Student plan\n\n Date: 2023.03.10 friday\n\n Time from: 17:30\n\n Time to: 19:00\n\n Hours: 2h00m\n\n Subject: Maths \n\n Room: 124A \n\n Teacher: John Smith \n\n 
DTEND:20230310T190000
DTSTAMP:20230227T140621Z
DTSTART:20230310T173000
SEQUENCE:0
SUMMARY:Math
UID:dcea6c77-3c51-4101-a62a-e4949e937fa9
END:VEVENT

如您所见,有一个房间:XXX \n\n模式。它可以被移动或复制-无所谓。

Exepted:
BEGIN:VEVENT
DESCRIPTION:Student plan\n\n Date: 2023.03.10 friday\n\n Time from: 17:30\n\n Time to: 19:00\n\n Hours: 2h00m\n\n Subject: Maths \n\n Room: 124A \n\n Teacher: John Smith \n\n 
LOCATION:Room: 124A
DTEND:20230310T190000
DTSTAMP:20230227T140621Z
DTSTART:20230310T173000
SEQUENCE:0
SUMMARY:Math
UID:dcea6c77-3c51-4101-a62a-e4949e937fa9
END:VEVENT
jv2fixgn

jv2fixgn1#

她你去:

#!/bin/sh

BASE=`basename "$0" ".sh" `

input="${BASE}.sampleIN"
cat >"${input}" <<"EnDoFiNpUt"
BEGIN:VEVENT
DESCRIPTION:Student plan\n\n Date: 2023.03.10 friday\n\n Time from: 17:30\n\n Time to: 19:00\n\n Hours: 2h00m\n\n Subject: Maths \n\n Room: 124A \n\n Teacher: John Smith \n\n
DTEND:20230310T190000
DTSTAMP:20230227T140621Z
DTSTART:20230310T173000
SEQUENCE:0
SUMMARY:Math
UID:dcea6c77-3c51-4101-a62a-e4949e937fa9
END:VEVENT
EnDoFiNpUt

awk -v matchStr="Room:" 'BEGIN{
    pshift=length(matchStr) ;
}{
    if( $0 ~ /^DESCRIPTION/ ){
        pos=index( $0, matchStr ) ;
        rem=substr( $0, pos+pshift ) ;
        split( rem, vals ) ;
        print $0 ;
        printf("LOCATION:%s %s\n", matchStr, vals[1] ) ;
    }else{
        print $0 ;
    } ;
}' "${input}"
bmvo0sr5

bmvo0sr52#

使用awk的替代解决方案:
如果行以'DES'开头,则使用awk match函数捕获与Room:匹配的文本和至少一个字母数字字符[[:alnum:]]+。现在使用该捕获组重新定义当前行,以包括换行符和目标文本。现在使用awk简写表示默认无条件{print},即'1'。1是条件,其计算结果始终为true。该操作被省略,因此执行默认的{print}。

awk '/^DES/ {match($0,/(Room: [[:alnum:]]+)/); $0=$0"\nLOCATION:"substr($0, RSTART, RLENGTH)}1' src.ics

输出:

BEGIN:VEVENT
DESCRIPTION:Student plan\n\n Date: 2023.03.10 friday\n\n Time from: 17:30\n\n Time to: 19:00\n\n Hours: 2h00m\n\n Subject: Maths \n\n Room: 124A \n\n Teacher: John Smith \n\n 
LOCATION:Room: 124A
DTEND:20230310T190000
DTSTAMP:20230227T140621Z
DTSTART:20230310T173000
SEQUENCE:0
SUMMARY:Math
UID:dcea6c77-3c51-4101-a62a-e4949e937fa9
END:VEVENT

src.ics内容:

BEGIN:VEVENT
DESCRIPTION:Student plan\n\n Date: 2023.03.10 friday\n\n Time from: 17:30\n\n Time to: 19:00\n\n Hours: 2h00m\n\n Subject: Maths \n\n Room: 124A \n\n Teacher: John Smith \n\n 
DTEND:20230310T190000
DTSTAMP:20230227T140621Z
DTSTART:20230310T173000
SEQUENCE:0
SUMMARY:Math
UID:dcea6c77-3c51-4101-a62a-e4949e937fa9
END:VEVENT

相关问题