您能向我解释一下这个“sed”命令并帮助我改进它吗?

您能向我解释一下这个“sed”命令并帮助我改进它吗?

我找到了一个命令行,但我不明白到底发生了什么。

pdftk $1 dump_data | sed -e 's/\(InfoValue:\)\s.*/\1\ /g'

在这一行中,命令sed是我的主要疑问。究竟发生了什么?

我是新手,我认为在这部分*/\1\命令sed正在调用$1,所以如果我更改$1我需要更改sed命令。也许是这种形式:

pdftk out dump_data | sed -e 's/\(InfoValue:\)\s.*/\out\ /g'

但由于我不了解理论,sed我无法确定我的假设。

答案1

不,该sed命令与管道之前的上一个命令没有直接关系。该sed命令仅接收标准输入上的数据。这不是理论问题sed,而是 shell 脚本编写的基本原理。

  1. pdftk $1 dump_data使用两个参数调用pdftk二进制文件(一种流行的 PDF 操作程序)。第一个参数是您作为 shell 脚本的第一个参数输入的内容。第二个参数pdftk是 command dump_data

  2. 第一个命令的输出通过管道(符号|)直接连接到第二个命令,这是一个sed替换。

  3. 任何出现InfoValue:后跟空格字符\s和任意数量其他字符的字符串 - 点表示任意字符,星号表示任意次数的重复,匹配。但在替换中只有第一部分(在一对反斜杠括号中),后面是一些白色的东西。实际上并不清楚最后一个反斜杠之后应该是什么。 Final 的g意思是“替换所有出现的地方”。

答案2

... | sed -e 's/\(InfoValue:\)\s.*/\1\ /g'

s/pattern/replacement/g命令查找所有匹配项图案上线,并将它们替换为替代品。左侧部分是\(InfoValue:\)\s.*,它匹配文字字符串InfoValue:(由于括号而捕获它),然后是一个空格(\s,可能来自 Perl 的 GNUism),然后是任何内容 ( .*) 直到行尾。替换中的引用\1第一个捕获的组(这里唯一的一个),并且空格是文字空格。由于捕获组与文字字符串匹配,因此实际上不需要捕获它,相同的字符串可以在右侧重复。但这样做当然可以消除无用的重复。

因此,在任何包含 的行上InfoValue:,它都会删除其后的所有内容。

sed这是从管道读取的输入,因为这就是sedand 管道的作用:sed从标准输入读取(当没有给出文件名时),管道将左侧命令的标准输出连接到右侧命令的标准输入 -手指挥。

$1右边的那个与 完全无关sed。它是 shell 参数,引用脚本的第一个命令行参数。 (或者 shell 函数,如果它在其中使用的话)。如果它是脚本的一部分,那么它应该作为 运行whatever.sh somefile.pdf,并且它会调用pdftkdump_data操作 在给定的文件上。

相关内容