gawk中gensub()的解释

use*_*850 1 awk

我有一个要求,我必须删除,文件中倒数第二行的内容,如下所示

\n
   '/tols/tope/triy8/ffgy/890/oki4/2egt.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/sddd.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/dfcf.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/rttemp.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/oxiule.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/sdafrtt.dbf',\n CHARACTER SET AL32UTF8\n ;\n
Run Code Online (Sandbox Code Playgroud)\n

我使用来自该论坛的 gawk 命令实现了它,如下所示:

\n

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

\n

[编辑]:原始问题显示"\\1"是由格式不正确引起的,但它实际上意味着"\\\\1"

\n

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

\n
  '/tols/tope/triy8/ffgy/890/oki4/2egt.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/sddd.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/dfcf.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/rttemp.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/oxiule.dbf',\n   '/tols/tope/triy8/ffgy/890/oki4/sdafrtt.dbf'\n CHARACTER SET AL32UTF8\n ;\n
Run Code Online (Sandbox Code Playgroud)\n

但我不理解该命令,尤其是这部分gensub(/,([^,]+)$/, "\\\\1", "")...\n我从手册中得到以下内容gensub

\n
\n

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

\n
\n

但就我而言,如何gensub获取倒数第二行以及如何用,null 替换 ...?\n有人可以解释一下吗?

\n

Ed *_*ton 5

它没有获取倒数第二行,而是删除,文件中的最后一行,无论该行位于哪一行。

  1. -v RS='\0'表示“将整个文件作为单个字符串读取”(BUG #1)
  2. -v ORS=意思是“不要在输出末尾添加换行符”
  3. /,([^,]+)$/表示“匹配逗号后跟非逗号,直到字符串末尾”
  4. "\1"表示“替换与\1”匹配的任何内容(BUG #2)
  5. ""表示“仅替换第一次出现的位置”(BUG #3)

话虽如此,还是有一些bug:

BUG 1:RS='\0'并不真正意味着“读取整个文件”,它意味着“在每个 NUL 字符处分割文件”,因此只有在文件不包含任何 NUL 时才会读取整个文件(POSIX 文本文件应该这样做) 't)。这应该是-v RS='^$'坚定地做你想做的事情。

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

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

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

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

  • 请参阅您系统上的“info gawk”部分“POSIX/GNU”或[网站](https://www.gnu.org/software/gawk/manual/html_node/POSIX_002fGNU.html) (2认同)