Text 翻译前后的数字`/`

Text 翻译前后的数字`/`,text,awk,perl,Text,Awk,Perl,在具有类似格式行的文本中: 3.1 Broadcasting 541/541,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0 3.2 Prefix Computation 590/590,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0 我想把前后的数字翻译成一定数量。例如,我想把前面的数字翻译成1,后面的数字翻译成2,上面的数字将变成: 3.1 Broadcasting 542/543,Blac

在具有类似格式行的文本中:

3.1 Broadcasting 541/541,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 590/590,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
我想把前后的数字翻译成一定数量。例如,我想把前面的数字翻译成1,后面的数字翻译成2,上面的数字将变成:

3.1 Broadcasting 542/543,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 591/592,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
我尝试使用awk来实现这一点:

但我的问题是,我不能在/之前找到这个号码。我该如何提高我的指挥能力

awk是这样做的正确工具吗?还是别的什么

谢谢。

在我看来,这不是最好的工具。当你必须用不同的角色来划分时,这会很困难。您可以使用split,但它会返回一个数组,修改数组的字段并遍历所有字段以联接它们,但此时您丢失了分隔符,并且不知道它是哪一个

它可以被认为是一个很好的选项,但不是最好的,因为它对于任务来说足够强大,但是在本例中,使用它的正则表达式和evaluate标志可以击败它,比如:

perl -pe 's{(\d+)/(\d+)(,)}{($1+1) . "/" . ($2+2) . $3}e' infile
它产生:

3.1 Broadcasting 542/543,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 591/592,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
编辑以解释命令:

第一个大括号是匹配文本的正则表达式,第二个大括号是替换字符串。第一个匹配斜杠和逗号之间的一个或多个数字。e标志允许在替换部分进行算术运算,因此由于分组I,第一个数字增加1,第二个数字增加2,并使用串联运算符。加入他们并替换上一场比赛。

在我看来,这不是最好的工具。当你必须用不同的角色来划分时,这会很困难。您可以使用split,但它会返回一个数组,修改数组的字段并遍历所有字段以联接它们,但此时您丢失了分隔符,并且不知道它是哪一个

它可以被认为是一个很好的选项,但不是最好的,因为它对于任务来说足够强大,但是在本例中,使用它的正则表达式和evaluate标志可以击败它,比如:

perl -pe 's{(\d+)/(\d+)(,)}{($1+1) . "/" . ($2+2) . $3}e' infile
它产生:

3.1 Broadcasting 542/543,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 591/592,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
编辑以解释命令:


第一个大括号是匹配文本的正则表达式,第二个大括号是替换字符串。第一个匹配斜杠和逗号之间的一个或多个数字。e标志允许在替换部分进行算术运算,因此由于分组I,第一个数字增加1,第二个数字增加2,并使用串联运算符。加入它们并替换上一个匹配项。

是的,awk是正确的工具。e、 g.第三个参数与GNU awk匹配:

$ awk 'match($0,/(.*)([0-9]+)\/([0-9]+)(.*)/,a){ $0 = a[1] a[2]+1 "/" a[3]+2 a[4] }1' file
3.1 Broadcasting 542/543,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 591/592,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
对于其他AWK,一种方法是:

$ awk 'match($0,/[0-9]+\/[0-9]+/){ split(substr($0,RSTART,RLENGTH),a,"/"); $0 = substr($0,1,RSTART-1) a[1]+1 "/" a[2]+2 substr($0,RSTART+RLENGTH) }1' file
3.1 Broadcasting 542/543,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 591/592,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
在这两种情况下,匹配都会隔离数字/数字部分,以便在将该段与之前和之后的内容重新组合之前,可以对该段进行操作。GNU awk解决方案的优点是捕获组保存在第三个arg数组中,因此您不需要在匹配后使用split+substr

通过使2尽可能相似,我认为以下内容可以清楚地说明呆呆/不呆呆的区别:

目瞪口呆:

非呆滞:

awk 'match($0,/[0-9]+\/[0-9]+/) {
    # START of what the gawk 3rd arg for match() saves you
    split(substr($0,RSTART,RLENGTH),b,"/")
    a[1] = substr($0,1,RSTART-1)
    a[2] = b[1]
    a[3] = b[2]
    a[4] = substr($0,RSTART+RLENGTH)
    # END of what the gawk 3rd arg for match() saves you
    $0 = a[1] a[2]+1 "/" a[3]+2 a[4]
}1' file

正如您所看到的,match的第三个arg只是一些语法上的糖分,但适度地加一点糖分也可以:-。

是的,awk是正确的工具。e、 g.第三个参数与GNU awk匹配:

$ awk 'match($0,/(.*)([0-9]+)\/([0-9]+)(.*)/,a){ $0 = a[1] a[2]+1 "/" a[3]+2 a[4] }1' file
3.1 Broadcasting 542/543,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 591/592,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
对于其他AWK,一种方法是:

$ awk 'match($0,/[0-9]+\/[0-9]+/){ split(substr($0,RSTART,RLENGTH),a,"/"); $0 = substr($0,1,RSTART-1) a[1]+1 "/" a[2]+2 substr($0,RSTART+RLENGTH) }1' file
3.1 Broadcasting 542/543,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
3.2 Prefix Computation 591/592,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0
在这两种情况下,匹配都会隔离数字/数字部分,以便在将该段与之前和之后的内容重新组合之前,可以对该段进行操作。GNU awk解决方案的优点是捕获组保存在第三个arg数组中,因此您不需要在匹配后使用split+substr

通过使2尽可能相似,我认为以下内容可以清楚地说明呆呆/不呆呆的区别:

目瞪口呆:

非呆滞:

awk 'match($0,/[0-9]+\/[0-9]+/) {
    # START of what the gawk 3rd arg for match() saves you
    split(substr($0,RSTART,RLENGTH),b,"/")
    a[1] = substr($0,1,RSTART-1)
    a[2] = b[1]
    a[3] = b[2]
    a[4] = substr($0,RSTART+RLENGTH)
    # END of what the gawk 3rd arg for match() saves you
    $0 = a[1] a[2]+1 "/" a[3]+2 a[4]
}1' file

正如您所看到的,match的第三个arg只是一些语法上的糖分,但适度地添加一点糖分也可以:-.

谢谢。1{}{}是指取代基吗?什么是`第二个{}意思是?e是什么意思?2在Python中也可以这样做吗?谢谢。我不使用perl,只使用python。Python能以awk的方式使用,但也能比awk更强大吗?@Tim:在我看来,是和否。是因为它比awk强大得多,不是因为它更冗长,更难将其作为一个快速而肮脏的单行程序解决方案。我明白了。Perl的语法是从awk、sed或其他东西派生出来的文本处理的一行程序吗?Perl one liner的语法是否与Perl脚本中文本字符串部分的语法相同?@Tim:据我所知,是的,Perl是基于awk、sed,我想还有其他一些。语法是相同的,除非您必须将开关转换为指令,例如-p打开文件并逐行读取其输入。谢谢。1{}{}是指取代基吗?什么是`第二个{}意思是?e是什么意思?2在Python中也可以这样做吗?谢谢。我不使用perl,只使用python。Python能以awk的方式使用,但也能比awk更强大吗?@Tim:在我看来,是和否。是因为它比awk强大得多,不是因为它更冗长、更容易理解
很难将其作为一种快速且肮脏的单行程序解决方案。我明白了。Perl的语法是从awk、sed或其他东西派生出来的文本处理的一行程序吗?Perl one liner的语法是否与Perl脚本中文本字符串部分的语法相同?@Tim:据我所知,是的,Perl是基于awk、sed,我想还有其他一些。语法是相同的,除非您必须将开关转换为指令,比如打开文件并逐行读取其输入的-p。