用 sed 减少一个数字

net*_*ric 3 sed regular-expression

我使用 提取了.txt文件中PDF 的元数据pdftk,现在我试图将BookmarkPageNumber每个书签的值减少一个整数。在.txt有这些行:

BookmarkBegin
BookmarkTitle: Preface
BookmarkLevel: 1
BookmarkPageNumber: 10
BookmarkBegin
BookmarkTitle: Author
... and so on
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 sed 的替代命令来做到这一点,这是我目前所拥有的:

// $1 is the source .txt file; $2 is the decrement
// __ is a placeholder for the variable with the original value
cat $1 | sed "s/BookmarkPageNumber: [0-9]*/BookmarkPageNumber: `expr __ - $2`/" | cat > metadata.txt
Run Code Online (Sandbox Code Playgroud)

如何将原始值放入变量中,然后__在同一个 sed 表达式中用它替换 palceholder ?

Cos*_*tas 9

为此目的最好使用awk,因为它支持算术运算

cat $1 | awk -v d=$2 '/BookmarkPageNumber:/{$2-=d}1'
Run Code Online (Sandbox Code Playgroud)

  • @netcentric 根据 awk 语法:AWK 程序是一系列 `pattern {action}` 对。可以省略 `pattern` `{action}` 中的一个,但不能同时省略两者。如果省略 `{action}`,则隐式为 `{print}`。如果省略了模式,则隐式匹配。所以这只是减少你的函数的技巧:使用模式`1`,它接受每一行并且可以省略`{print}` (3认同)

Cyr*_*rus 5

awk '!/BookmarkPageNumber:/ {print}; /BookmarkPageNumber:/ {print $1 " " $2-1}' old.txt > new.txt
Run Code Online (Sandbox Code Playgroud)