#! /bin/bash
# C-band Edit
dqt='"'
str5="polarization=${dqt}2${dqt}"
for x in {3600..4200} do;
sed -i "/$str5.*$x/s/$x/$((x-600))/" satellites.xml
done
sed -e "/$str5/ { s/3[6-9][0-9][0-9]/3-600/g; s/4[01][0-9][0-9]\|4200/4-600/g }"
可能还有许多其他方法可以优化正则表达式,但是您这样做的次数越多,将来阅读和修改它们的难度就越大。
3964, 4155,4200并被更改。 3500而4255不是,它们超出了所需的范围。
[0-9]在某些语言环境(该范围内还有其他字符)中不会像您期望的那样工作。我不确切知道哪些语言环境,但我已经看到它经常被提及,足以知道[0-9]不能完全依赖它。如果这影响到您,您可以使用[[:digit:]]代替[0-9],或使用perl -p代替sed(因此您可以使用\d代替[0-9])。同样适用于 range [6-9],请[6789]改用。
最后,要非常小心你放入$str5变量中的内容。因为它被插入到sed命令中,所以很容易破坏 sed 脚本(例如,如果$str5包含 a /,它将破坏/$str5/匹配)。sed 不知道它的脚本部分来自一个 shell 变量,它所看到的只是它被赋予运行的脚本。
#! /bin/bash
# C-band Edit
dqt='"'
str5="polarization=${dqt}2${dqt}"
sed -Ei "/$str5$x/{"$(for x in {36..41}; do echo -n "s/$x([0-9]{2})/$((x-6))\\1/;"; done)";s/4200/3600/;}" satellites.xml
我突然想到你不是指文字字符串
x-600
,你的意思是“从 3600 到 4200 之间的每个值中减去 600”。在这种情况下,使用 perl,而不是 sed:这使用 perl 的
/e
正则表达式修饰符来导致右侧 ($&-600
) 被评估为 perl 表达式。$&
是一个包含匹配值的 perl 变量,因此$&-600
意味着从该值中减去 600。如果那是您真正想要的,我会在下面留下我的原始答案。也因为它有有用的解释,这些解释仍然与上面的 perl 答案有些相关。
与 sed 一样,perl 有一个
-i
就地编辑选项,因此您可以将其直接应用到您的 satellites.xml 文件中。详情请参阅man perlrun
。另外值得注意的是:在处理 XML 文件时,您可能应该使用 XML 解析器。幸运的是,perl 有几个可供选择,例如XML::Parser或集合libxml-perl。
我没有您实际输入的示例,因此我制作了一个示例来演示什么会改变,什么不会:
大致翻译成英文,就是“如果当前行包含$str5(
polarization="2"
),则对其应用这三个s///
操作”。笔记:
无需从 3600..4200 循环。这将在一次运行中进行所有更改
sed
,而不是 600 次运行。您希望更改 3600-4200 的值。这意味着您需要 3 次搜索和替换操作:
或者,这可以通过两个
s///
操作来完成,将最后两个合并为一个:可能还有许多其他方法可以优化正则表达式,但是您这样做的次数越多,将来阅读和修改它们的难度就越大。
3964
,4155
,4200
并被更改。3500
而4255
不是,它们超出了所需的范围。[0-9]
在某些语言环境(该范围内还有其他字符)中不会像您期望的那样工作。我不确切知道哪些语言环境,但我已经看到它经常被提及,足以知道[0-9]
不能完全依赖它。如果这影响到您,您可以使用[[:digit:]]
代替[0-9]
,或使用perl -p
代替sed
(因此您可以使用\d
代替[0-9]
)。同样适用于 range[6-9]
,请[6789]
改用。最后,要非常小心你放入
$str5
变量中的内容。因为它被插入到sed
命令中,所以很容易破坏 sed 脚本(例如,如果$str5
包含 a/
,它将破坏/$str5/
匹配)。sed 不知道它的脚本部分来自一个 shell 变量,它所看到的只是它被赋予运行的脚本。此外,整个字符串将被sed 解释为正则表达式- 这意味着正则表达式元字符不会被解释为文字字符,除非它们使用
\
. eg.
将被解释为“任何字符”而不是文字点,除非它被转义为\.
do
您的尝试原则上是正确的,正如 frabjous 指出的那样,您只是错过了在分号之前关闭列表:但请注意,这将使您“就地”编辑文件 601 次,实际上每次执行时都会创建和删除数百个新文件。
为避免这种情况,您可以
sed
一些对数字的基本理解,这很有趣,但不是很有用python
例如perl
awk
sed
:替换将产生
sed
脚本