有什么办法让 sed 具有“详细模式”或“调试模式”?

有什么办法让 sed 具有“详细模式”或“调试模式”?

有没有办法让gnu sed运行的内容和完成的内容变得详细?
我想要一个类似“调试模式”的东西,这样我就可以看到 - 对于每一行输入 - 脚本运行之前和之后的保留空间和模式空间的内容等。

答案1

作为弗拉桑 提及,GNUsed引入了--debug4.6 版本中的选项几乎可以满足您的需求;例如,如果你运行:

printf '%s\n' one two  | sed --debug 'H;1h;$x;$s/\n/_/g'

输出是

SED PROGRAM:
  H
  1 h
  $ x
  $ s/\n/_/g
INPUT:   'STDIN' line 1
PATTERN: one
COMMAND: H
HOLD:    \none
COMMAND: 1 h
HOLD:    one
COMMAND: $ x
COMMAND: $ s/\n/_/g
END-OF-CYCLE:
one
INPUT:   'STDIN' line 2
PATTERN: two
COMMAND: H
HOLD:    one\ntwo
COMMAND: 1 h
COMMAND: $ x
PATTERN: one\ntwo
HOLD:    two
COMMAND: $ s/\n/_/g
MATCHED REGEX REGISTERS
  regex[0] = 3-4 '
'
PATTERN: one_two
END-OF-CYCLE:
one_two

我不知道你使用什么发行版,但是这个版本的 sed (或更高版本)可用在 Debian 10 中,在 Ubuntu 19.04 中和衍生品;它将在 Fedora 33 中提供。

答案2

我发现从 sed 中获取我个人认为的“详细输出”有点棘手,我的意思是“sed 在做什么”。

如果省略参数-i,则编辑后的结果流将直接打印到控制台。如果输入文件/流很长和/或您正在进行大量编辑或细微编辑,那么这并不是很有帮助。

正如斯蒂芬指出的,该--debug选项会告诉你一切sed 正在做。这意味着它会打印每个输入行,告诉您它在文件行上运行的每个命令、这些命令的结果以及编辑的行。所以根据我的经验太冗长了。我通常使用 sed 进行就地搜索和替换。在 1450 行文件上运行单个正则表达式替换,输出约为 8700 行。相当耳熟能详,值得细读。但你可以通过一些创造性的 grep 来获得更多信息。

对于正则表达式搜索和替换的情况,以下内容确实很有帮助:

sed --debug -e 's/pattern/replacement/' file.txt | grep -B 3 -A 4 -P '^MATCHED'

每次匹配正则表达式命令时,调试输出都会打印一行以“MATCHED”开头的行,这是每个匹配的 8 行中的第四行,告诉您 sed 做了什么。因此, include-B 3 -A 4只会打印 sed 实际进行更改的行组,并且不会为每个没有更改的输入行打印 8 行。

显然,除了正则表达式替换之外,您还可以使用 sed 执行其他操作,因此您需要对此进行修改以适合您的用例和命令,但我觉得这种方法可以让您将输出削减--debug为更可用的内容。即我期望基于其他实用程序(如 cp、mv 等)的详细标志。

相关内容