Shell 脚本 - 如何替换行

Shell 脚本 - 如何替换行

Ubuntu 9.10

嗨,大家好,

我想创建一个脚本,用于自动更新 .htaccess 文件中的一行。有人能告诉我一些创建基本“查找和替换”脚本的说明吗?

我正在想象一些东西,基本上是说“寻找特殊标记#ABC 和#XYZ...删除标记之间的条目并将其替换为'foo'”。

答案1

你要sedsed -i s/regex to look for/string to replace it with/

如果需要多行长度,您可以编写更复杂的脚本,尽管在某些时候 sed 的强大功能和简洁性确实开始对其产生不利影响,而我更喜欢开始使用更冗长但通常可理解的脚本语言进行编写(我更喜欢 Ruby,但口味各不相同)。

如果您提供一个实际的例子来说明您想要完成的事情,那么有人可能会想出“最佳”的方法来实现它;目前,您的例子还很模糊,无法给出具体的解决方案。

答案2

尝试这个:

awk '/^#ABC/ {start=1; print; next} /^#XYZ/ {start=0; print "foo"; print; next} start!=1 {print}' .htaccess > .htaccess.NEW

它可以缩写为:

awk '/^#ABC/ {start=1; print; next} /^#XYZ/ {start=0; print "foo"} start!=1 {print}' .htaccess > .htaccess.NEW

答案3

如果您的文件很小(我认为 .htaccess 应该很小),那么 Perl 可以“吸收”它们并将整个文件作为单个字符串进行操作,使用 s///s(末尾的 's' 修饰符将整个字符串视为一行)。

例如:perl -i.bak -p -0 -e 's/#ABC\n.*#XYZ/foo/s' 文件名列表

-i.bak 告诉 perl 保存备份,在本例中称为 list.bak of.bak file.bak names.bak -p -0 告诉 perl 读取整个文件,-e 告诉它在命令行上应用正则表达式。

此特定版本将仅替换第一组标记,如果标记根本不存在则不会执行任何操作(但它仍会创建备份文件)。

相关内容