我找到了一个命令行,但我不明白到底发生了什么。
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 脚本编写的基本原理。
pdftk $1 dump_data
使用两个参数调用pdftk
二进制文件(一种流行的 PDF 操作程序)。第一个参数是您作为 shell 脚本的第一个参数输入的内容。第二个参数pdftk
是 commanddump_data
。第一个命令的输出通过管道(符号
|
)直接连接到第二个命令,这是一个sed
替换。任何出现
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
这是从管道读取的输入,因为这就是sed
and 管道的作用:sed
从标准输入读取(当没有给出文件名时),管道将左侧命令的标准输出连接到右侧命令的标准输入 -手指挥。
$1
右边的那个与 完全无关sed
。它是 shell 参数,引用脚本的第一个命令行参数。 (或者 shell 函数,如果它在其中使用的话)。如果它是脚本的一部分,那么它应该作为 运行whatever.sh somefile.pdf
,并且它会调用pdftk
的dump_data
操作
在给定的文件上。