替换文件中的多行字符串


17

我有许多文件想要通过用另一个多行字符串替换一个多行字符串来更新。类似于以下内容:

* Some text, 
* something else
* another thing

我想替换为:

* This is completely
* different text

结果将是,替换后包含第一个文本块的文件现在将包含第二个字符串(文件的其余部分保持不变)。

问题的一部分是,我必须在文件系统中找到要更新的文件列表。我想我可以为此使用grep(尽管再次使用多行字符串不是那么容易),然后将其通过sed传送吗?

是否有捷径可寻?sed是一个选项,但是很尴尬,因为我必须添加\ n等。是否有办法说“从此文件中获取输入,在这些文件中进行匹配,然后用另一个文件的内容替换”?我可以在需要时使用python,但是我想要快速简单的方法,因此,如果有可用的实用程序,我宁愿使用它而不是编写自己的脚本(我知道该怎么做)。


您可能应该为此使用perl。 stackoverflow.com/questions/1030787/…–
Orion

3
因此,您想匹配some text, something else another thing它是否跨越多行?还是您只想匹配some text,\nsomething else\nanotherthing
mikeserv

2
编辑您的问题,并弄清楚每个文件的确切内容以及所需的输出是什么。
jimmij 2015年

该字符串跨越多行。我宁愿忽略匹配/替换时的空格,因为它可能并不完全相同,但是如果我只进行1-1匹配(换行符和全部),则没什么大不了的。
ventsyv

Answers:


12

用一个或多个输入文件中的文件“ new”的内容替换“ Some ... \ n ... Thing”

perl -i -p0e 's/Some.*?thing\n/`cat new`/se' input.txt ...
  1. -i 直接更改input.txt
  2. -p0 提取输入文件文件并最终打印
  3. s/regexp/.../s 在正则表达式中..|\n
  4. s/.../exp/e 替换为 eval(exp)
  5. 新-包含替换文本的文件(完全是...不同的文本)
  6. 如果有用,可以展开原始文本 s/Some text\n...\n...thing\n/...

如何处理名为“ before”的文件以查找该文件的(多行)内容?我试过了,但是没有用。
科沃斯

@Kvothe,我们需要更多详细信息...假设“之前”没有特殊字符,可以尝试perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
JJoao

并假设“之前”包含除“和”外的所有特殊字符(换行,斜杠,方括号)。
科沃斯

5
sed -e :n -e '$!N;/\n.*\n/!{$!bn
};  s/some text,\n* *something else\n* *another thing/this is completely\
different text/;P;D' <infile

我担心您将很难找到适合您的解决方案,直到您对问题进行具体描述为止,但是正如我所看到的,这是QA最适合的解决方案。也许这会让您有个主意-它将始终始终在模式空间中保留3行-提前2行-同时仅一次向前滑动输入文件一行。

无论它是否跨越多行,它都应该能够匹配您的字符串-即最多三行。但是,没有在替换中反映该规定的规定-它始终跨越编写的两行。


0

不强壮(因为不检查第二个字符串但是很容易稳定)并且可以不是posix编译的,但是非常简单:

sed '/^Some text/{:1;/another thing$/!{N;b 1}
     s/.*/this is completely\ndifferent text/g}' input.txt

第一条命令添加行 某些文本直到遇到另一件事为止,然后第二行将其更改为其他文本。

注意局限性在于,某些文本后应始终加上其他内容


问题是,该字符串可能超过2线(多达十几左右),并且可以包含其他的东西,可能需要进行转义,如制表符,*等等
ventsyv

@ventsyv行数或分隔符没有问题-脚本仅检查开始和结束。如果起始字符串出色地可以标记文本就足够了。如果没有更好的显示输入示例,以产生正确的模式。
Costas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.