Gawk中gensub()的说明

时间:2020-06-24 10:44:48

标签: awk

我有一个必须删除文件第二倒数第二行中的“,”的要求

int

我是通过以下论坛中的gawk命令实现的:

-bash-3.2 $ gawk -v RS ='\ 0'-v ORS ='{print gensub(/,([[^,] +)$ /,“ \ 1”,“”)}''tstop1 < / p>

获得的输出作为必需的输出:

   '/tols/tope/triy8/ffgy/890/oki4/2egt.dbf',
   '/tols/tope/triy8/ffgy/890/oki4/sddd.dbf',
   '/tols/tope/triy8/ffgy/890/oki4/dfcf.dbf',
   '/tols/tope/triy8/ffgy/890/oki4/rttemp.dbf',
   '/tols/tope/triy8/ffgy/890/oki4/oxiule.dbf',
   '/tols/tope/triy8/ffgy/890/oki4/sdafrtt.dbf',
 CHARACTER SET AL32UTF8
 ;

但是我不理解命令,尤其是这部分gensub(/,([[^,] +)$ /,“ \ 1”,“”)... 我从gensub的人那里得到了以下内容:

gensub(r,s,h [,t])在目标字符串t中搜索正则表达式r的匹配项。如果h是以g或G开头的字符串,则将r的所有匹配项替换为s。否则,h是一个数字,指示要替换r的哪个匹配项。如果未提供t,则改用$ 0。在替换文本中,序列\ n(其中n是从1到9的数字)可用于仅表示与第n个带括号的子表达式匹配的文本。序列\ 0代表整个匹配文本,字符&也是如此。与sub()和gsub()不同,修改后的字符串将作为函数的结果返回,并且原始目标字符串不会更改。

但是在我的情况下,gensub如何获得倒数第二行,以及它如何用空...代替“,”? 有人可以解释吗?

1 个答案:

答案 0 :(得分:4)

它没有获得倒数第二行,无论文件位于哪一行,它都将删除文件的最后,

  1. -v RS='\0'的意思是“以单个字符串读取整个文件”(错误1)
  2. -v ORS=的意思是“不要在输出的末尾添加换行符”
  3. /,([^,]+)$/的意思是“匹配逗号,然后在字符串末尾匹配非逗号”
  4. "\1"的意思是“替换与\1匹配的所有内容”(错误2)
  5. ""的意思是“仅替换第一次出现的问题”(错误3)

话虽如此,但有一些错误:

错误1:RS='\0'并不真正表示“读取整个文件”,而是表示“在每个NUL字符处分割文件”,因此仅在出现以下情况时才读取整个文件:该文件不包含任何NUL(POSIX文本文件不应该包含)。应该改为-v RS='^$'来稳健地完成您想做的事情。

BUG#2:"\1"作为替换字符串没有意义。 "\\1"的意思是“替换与第一个捕获组匹配的任何东西”,因此将根据需要从文件中删除最后一个逗号。

BUG#3:在这种情况下,""将在较新版本的gawk中生成警告消息,因为这应该是一个数字(例如您的情况为1)或“ {global}”的"g"

因此,修复错误后,您的命令应为:

gawk -v RS='^$' -v ORS= '{print gensub(/,([^,]+)$/,"\\1",1)}' tstop1