我有一个 kdenlive 项目文件(基本上是一个 xml 文件),里面有很多文本剪辑。我需要批量编辑多次出现的特定文本的 x 坐标。这是一个例子:
<position x="1316" y="553">
<transform>1,0,0,0,1,0,0,0,1</transform>
</position>
<content line-spacing="0" shadow="0;#64000000;3;3;3" font-underline="0" box-height="94" font="Cambria" letter-spacing="0" font-pixel-size="80" font-italic="0" typewriter="0;2;1;0;0" alignment="4" font-weight="50" box-width="91" font-color="0,255,255,255">MIA!</content>
</item>
<item type="QGraphicsTextItem" z-index="7">
<position x="1106" y="552">
<transform>1,0,0,0,1,0,0,0,1</transform>
</position>
<content line-spacing="0" shadow="0;#64000000;3;3;3" font-underline="0" box-height="94" font="Cambria" letter-spacing="0" font-pixel-size="80" font-italic="0" typewriter="0;2;1;0;0" alignment="4" font-weight="50" box-width="91" font-color="255,255,255,255">6.5</content>
</item>
我只需要编辑有关文本MIA!的 x 坐标! ,即1316。我想要做的是添加 40 并使 x 坐标变为1356。
文件中有多个MIA!文本,它们的 x 坐标不同。我需要一个脚本,给定一个数字(例如 40),可以将其与 x 坐标相加,并在每次出现 MIA !文本时用相加后的值替换该值。
我的想法是编写一个脚本,将MIA!模式前 3 行找到的 x 坐标保存在一个变量中,然后循环将每个数字相加 40。但我不知道如何替换文件中的新值。
#!/bin/bash
xcoord=`perl -ne 'push @lines,$_; print $lines[0] if /MIA!/; shift(@lines) if $.>3;' "$@" | cut -d'"' -f2`
for word in $xcoord
do
final=$(( $word + 40 ))
....
done
最终的输出应该是:
<position x="1356" y="553">
<transform>1,0,0,0,1,0,0,0,1</transform>
</position>
<content line-spacing="0" shadow="0;#64000000;3;3;3" font-underline="0" box-height="94" font="Cambria" letter-spacing="0" font-pixel-size="80" font-italic="0" typewriter="0;2;1;0;0" alignment="4" font-weight="50" box-width="91" font-color="0,255,255,255">MIA!</content>
</item>
<item type="QGraphicsTextItem" z-index="7">
<position x="1106" y="552">
<transform>1,0,0,0,1,0,0,0,1</transform>
</position>
<content line-spacing="0" shadow="0;#64000000;3;3;3" font-underline="0" box-height="94" font="Cambria" letter-spacing="0" font-pixel-size="80" font-italic="0" typewriter="0;2;1;0;0" alignment="4" font-weight="50" box-width="91" font-color="255,255,255,255">6.5</content>
</item>
可能是这样的:
在每个 Unix 机器上的任意 shell 中使用任意 awk,无需将整个输入读入内存,也无需读取输入两次:
要更改输入文件,如果您使用 GNU awk,则更改为
awk
或awk -i inplace
使用任何 awk 更改' "$1"
为' "$1" > tmp && mv tmp "$1"
。答案从问题中移出
自己用 sed 找到了解决方案:
首先,sed 使用在变量中找到的值来搜索坐标
xcoord
。然后,如果在 3 行之后出现该单词MIA!
,它将用在变量中找到的总和数字替换该值final
。