如何用文件中的单个单词替换多行(替换)?


9

我的filename文件内容如下(例如):

My block of line starts from here 
START
First line
second line
third line
END
and end to here for example.

我想,以取代之间的行块START,并END只用一个词,例如用SINGLEWORD。如下所示:

My block of line starts from here 
SINGLEWORD
and end to here for example.

我可以使用以下命令找到我的代码行:

grep -Pzo "START(.|\n)*END" filename

运行上述命令的结果将是这样的:

START
First line
second line
third line
END

然后,我使用此命令将所有行合并为一行:

LAST_RESULT | sed -e :a -e '/$/N; s/\n/ /; ta'

然后我将得到以下结果:

START First line second line third line END

并用我的最后一条命令LAST_RESULTS | sed 's/.*/SINGLEWORD/'将它们更改为,"SINGLEWORD"然后得到此结果。

SINGLEWORD

现在我想要的是:如何使用此命令(或您的建议命令)并将行替换为“ SINGLEWORD”字样?最终结果将类似于以下文件:

My block of line starts from here 
SINGLEWORD
and end to here for example.

Answers:


14

在以下位置可以很容易地做到这一点perl

$ perl -i -p0e 's/START.*?END/SINGLEWORD/s' file
$ cat file
My block of line starts from here 
SINGLEWORD
and end to here for example. 

说明

-0 将行分隔符设置为null

-p将给定的脚本-e应用于每一行并打印该行

regexp修饰符:

  • /s将字符串视为单行。也就是说,更改.以匹配任何字符,即使是换行符也通常不匹配。

为什么?

  • 默认情况下,量化的子模式为“贪婪”,也就是说,它将匹配尽可能多的次数(给定特定的起始位置),同时仍允许其余模式匹配。如果希望它与最小次数匹配,请在量词后面加上?

@KasiyA:sed应该可以使用,但可能更难阅读(看这个问题
Sylvain Pineau 2014年

还有一个,因为我的开始和结束图形具有特殊字符(/*?在它),这些都只是例子。您能解释一下您的命令吗?
2014年

@KasiyA你可以逃脱这样的字符\(完全是用sed): ,,\/\*\?
西尔万·皮诺

我尝试了@KasiyA perl -i -p0e 's/\/\*.*?\*\//SINGLEWORD/sm'。它应该起作用
Sylvain Pineau

@KasiyA我想我现在已经完成解释了;)
Sylvain Pineau 2014年

14

我想知道如果没有和其他人perl,这是否有可能python。我发现使用以下解决方案sed

$ sed ':a;N;$!ba;s/START.*END/SINGLEWORD/g' filename

说明:

  1. :a 创建标签'a'
  2. N 将下一行追加到模式空间
  3. $! 如果不是最后一行,则ba 分支(转到)标签“ a”
  4. š 替代/START.*END/通过SINGLEWORD/克 全局匹配(多次它可以)

这里找到的。

@KasiyA,谢谢你我学到了很多有趣的东西!

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.