用于替换由大括号分隔的多个行的内容的Sed

时间:2016-06-18 06:24:09

标签: regex sed

我正在寻找能够找到一组行的sed函数,并使用分隔符将其替换为另一组。

实施例

来源:

class Requests
{
  function approveRequests($users){
    foreach($users as $user){
      if(hasQualified($user)){
         acceptUser($user);
      }else{
         rejectUser($user)
      }
   }
 } 

}

class Requests
{
  function approveRequests($users){
    autoAcceptMember($users);
  } 
}

请注意,源可能有几组其他大括号,但它们将同等匹配。所以它有3个开放,然后将有3个关闭,所以我想把所有东西都放在中间

2 个答案:

答案 0 :(得分:0)

sed无法执行上述操作,只能在一行上运行。

(好吧,它可以在多行上运行,但它不能区分看起来相同的}

你必须使用例如awk或其他更高级的语言(python,perl等)

答案 1 :(得分:0)

这可能会让您了解如何使用sed编辑文件。

cat inputFile.txt | sed -n '/^class Requests/,/^}/ p' | sed -e '/foreach/,$ d' | sed -e 's/\(function.*\)/\1\n    autoAcceptMember($users);\n  }\n}\n/'

<强>输出:

class Requests
{
  function approveRequests($users){
    autoAcceptMember($users);
  }
}

<强> inputFile.txt:

class here
{
    are
    some extra lines
} 

class Requests
{
  function approveRequests($users){
    foreach($users as $user){
      if(hasQualified($user)){
         acceptUser($user);
      }else{
         rejectUser($user)
      }
   }
 } 

}

class here2 {
    function are ()  {
        some extra lines 
        also
}

使用sed并与正则表达式匹配并在

之间打印线条
> cat inputFile.txt | sed -n '/^class Requests/,/^}/ p'
class Requests
{
  function approveRequests($users){
    foreach($users as $user){
      if(hasQualified($user)){
         acceptUser($user);
      }else{
         rejectUser($user)
      }
   }
 }

}

使用sed并与正则表达式匹配并删除

之间的行
sed -e '/foreach/,$ d' will give the following, in context:
> cat inputFile.txt | sed -n '/^class Requests/,/^}/ p' | sed -e '/foreach/,$ d'
class Requests
{
  function approveRequests($users){

使用sed并与正则表达式匹配,替换并添加标记匹配

sed -e 's/\(function.*\)/\1\n    autoAcceptMember($users);\n  }\n}\n/' will give the following, in context:
> cat inputFile.txt | sed -n '/^class Requests/,/^}/ p' | sed -e '/foreach/,$ d' | sed -e 's/\(function.*\)/\1\n    autoAcceptMember($users);\n  }\n}\n/'
class Requests
{
  function approveRequests($users){
    autoAcceptMember($users);
  }
}