使用新行 Linux 搜索和追加
Posted
技术标签:
【中文标题】使用新行 Linux 搜索和追加【英文标题】:Search and Append with new line Linux 【发布时间】:2017-04-14 23:20:12 【问题描述】: protected void setUp() throws Exception
//...
我想为所有类中的每个方法添加@Before。我有近 500 多个课程。如果我手动操作会非常困难。
@Before
protected void setUp() throws Exception
//...
我试过了
sed -i "s/protected void setUp()/@Before()\nprotected void setUp()/g" File
但如果我这样做,对齐方式就会改变。
@Before()
protected void setUp() throws Exception
请帮帮我。我想有正确的对齐方式
【问题讨论】:
什么是常数部分?protected void
?
受保护的 void setUp()
【参考方案1】:
使用 GNU awk,您可以使用 gensub()
捕获 protected void setUp()
前面的空格数并将它们打印在所需文本的前面:
$ awk '$0=gensub(/^(\s*)(protected void setUp)/, "\\1@Before\n&", 1)1' file
@Before
protected void setUp() throws Exception
//...
看看它是如何工作的:
$0=gensub()
执行更改并将当前记录设置为此值。
gensub(/^(\s*)(protected void setUp)/, "\\1@Before\n&", 1)
这将查找开头带有一些空格的字符串 protected void setUp
并捕获两者。然后,它用那些空格 + "@Before" 替换它,然后是新行和原始行。
1
它触发 awk 的默认操作,与打印当前(更新的)行一致。
请注意,这只会检查到 protected void setUp
。如果你还想检查setUp
后面的括号,说:/^(\s*)(protected void setUp\(\))/
(需要转义括号,因为普通的有捕获组的功能)。
这考虑到捕获的组可以通过说\\n
、n
其序数或&
来表示完整字符串。
通过更极端的示例文件查看它的实际效果:
$ cat a
protected void setUp() throws Exception
//...
blablablabla
protected void setUp() throws Exception
and this is
protected void setUp() throws Exception
变成:
$ awk '$0=gensub(/^(\s*)(protected void setUp)/, "\\1@Before\n&", 1)1' a
@Before
protected void setUp() throws Exception
//...
blablablabla
@Before
protected void setUp() throws Exception
and this is
@Before
protected void setUp() throws Exception
【讨论】:
【参考方案2】:sed 用于在单个行上进行简单替换,仅此而已。这不是你想要做的,所以这不是 sed 的工作,而是 awk 的工作。这适用于任何 awk:
$ awk 's=$0 sub(/protected void setUp().*/,"@Before",s)print s 1' file
@Before
protected void setUp() throws Exception
//...
借用@fedorqui 更全面的示例输入文件:
$ cat a
protected void setUp() throws Exception
//...
blablablabla
protected void setUp() throws Exception
and this is
protected void setUp() throws Exception
$ awk 's=$0 sub(/protected void setUp().*/,"@Before",s)print s 1' a
@Before
protected void setUp() throws Exception
//...
blablablabla
@Before
protected void setUp() throws Exception
and this is
@Before
protected void setUp() throws Exception
【讨论】:
【参考方案3】:我认为sed
的这个简单任务没有错:
sed -r -i -e "s/^([ \t]*)(protected void setUp())/\1@Before()\n\1\2/g" File
记得在sed
中添加-r
参数来激活正则表达式语法,
使用 `^([ \t]*)' 获得缩进,
在插入的装饰器之前应用缩进,也在原行之前应用缩进。
【讨论】:
以上是关于使用新行 Linux 搜索和追加的主要内容,如果未能解决你的问题,请参考以下文章