使用bash

时间:2018-05-17 03:01:47

标签: regex bash shell sed grep

我有一个字符串:func showFetchNextSliceFailed(result: UserResult<[Product]>) {

从此,我想,

1)。只提取showFetchNextSliceFailed

2)。将其插入到给定行的正上方,为#Mark showFetchNextSliceFailed

  func showProductsList(result: UserResult<[Product]>) {    
  }      
  func showFetchNextSliceFailed(result: UserResult<[Product]>) {    
  }

预期输出:

  #Mark showProductsList
  func showProductsList(result: UserResult<[Product]>) {    
  }

  #Mark showFetchNextSliceFailed
  func showFetchNextSliceFailed(result: UserResult<[Product]>) {    
  }

我尝试使用grepsed,但仍无法正确弄清楚如何提取和替换字符串。

5 个答案:

答案 0 :(得分:1)

如果您有以下code文件:

<强> INPUT:

  $more code
  func showProductsList(result: UserResult<[Product]>) {

  }

  func showFetchNextSliceFailed(result: UserResult<[Product]>) {

  }

<强>命令:

perl -i.bak -pe "s/^^( *|\t*)func\s(\w+)func\s(\w+)/\1#Mark \2\n\1func \2/g" code

<强>输出:

  #Mark showProductsList
  func showProductsList(result: UserResult<[Product]>) {

  }

  #Mark showFetchNextSliceFailed
  func showFetchNextSliceFailed(result: UserResult<[Product]>) {

  }

解释:

  • -i.bak perl的就地模式,其中包含输入文件的备份
  • s/^( *|\t*)func\s(\w+)func\s(\w+)/\1#Mark \2\n\1func \2/g查找并替换demo
  • 详细说明的模式

答案 1 :(得分:1)

使用sed:

$ sed 's/\(.*func \)\([^ ]*\)\((.*\)/#Mark \2\n\1\2\3/' file.txt

如果要替换文件:

$ sed -i 's/\(.*func \)\([^ ]*\)\((.*\)/#Mark \2\n\1\2\3/' file.txt

答案 2 :(得分:1)

使用GNU awk为第3个arg匹配():

$ awk 'match($0,/\<func\s+([^(]+)\(/,a){print "#Mark", a[1]} 1' file
#Mark showProductsList
func showProductsList(result: UserResult<[Product]>) {
}
#Mark showFetchNextSliceFailed
func showFetchNextSliceFailed(result: UserResult<[Product]>) {
}

答案 3 :(得分:0)

关注awk也可以帮助您。

awk '/func/ && /showProductsList\(/{print "  #Mark showProductsList" ORS $0;next} /func/ && /showFetchNextSliceFailed\(/{print "  #Mark showFetchNextSliceFailed" ORS $0;next} 1'   Input_file

现在也添加非单线形式的解决方案。

awk '
/func/ && /showProductsList\(/{
    print "  #Mark showProductsList" ORS $0;
    next}
/func/ && /showFetchNextSliceFailed\(/{
    print "  #Mark showFetchNextSliceFailed" ORS $0;
    next}
1
'   Input_file

如果您想将输出保存到Input_file,那么您也可以将> temp_file && mv temp_file Input_file附加到上面的代码中。

答案 4 :(得分:-1)

正则表达式:func\s(\w+)

替换为:#Mark \1\n func \1

Demo