sed脚本删除多行中括号中的所有内容

时间:2013-04-15 13:49:44

标签: sed

我正在尝试使用sed脚本删除文件中数组的内容。我试图删除内容只留下括号()。但是我无法让sed脚本在多行上工作。

我正在尝试更改文件的当前状态:

LIST = ( "content"
         "content1"
         "content3")

到此:

LIST = ()

但是我使用的sed脚本只将文件更改为:

LIST = ()
     "content"
     "content1"
     "content2"

sed -e 's/LIST=\([^)]*\)/LIST=() /g' filename

我还应该提到文件中还有其他一组括号,我不想受到影响。

e.g

LISTNUMBER2("CONTENT")  

不应该被清空。

2 个答案:

答案 0 :(得分:1)

这个 sed 单行程适用于您的示例:

sed -n '1!H;1h;${x;s/(.*)/()/;p}'

试验:

kent$  echo 'LIST = ( "content"
         "content1"
         "content3")'|sed -n '1!H;1h;${x;s/(.*)/()/;p}'
LIST = ()

如果您可以使用 awk ,这个单行也适用于您的示例:

awk -v RS="" '{sub(/\(.*\)/,"()")}1' 

试验:

kent$  echo 'LIST = ( "content"
         "content1"
         "content3")'|awk -v RS="" '{sub(/\(.*\)/,"()")}1'                                                                                                                  
LIST = ()
OP的评论

编辑

多括号情况:

<强> AWK

 awk -v RS="\0" -v ORS="" '{gsub(/LIST\s*=\s*\([^)]*\)/,"LIST = ()")}1' file

试验:

kent$  cat file
LISTKEEP2("CONTENT")  
LIST = ( "content"
         "content1"
         "content3")
LISTNUMBER2("CONTENT")  

kent$  awk -v RS="\0" -v ORS="" '{gsub(/LIST\s*=\s*\([^)]*\)/,"LIST = ()")}1' file
LISTKEEP2("CONTENT")  
LIST = ()
LISTNUMBER2("CONTENT") 

<强> SED

 sed -nr '1!H;1h;${x;s/(LIST\s*=\s*\()[^)]*\)/\1)/;p}' file

kent$  sed -nr '1!H;1h;${x;s/(LIST\s*=\s*\()[^)]*\)/\1)/;p}' file
LISTKEEP2("CONTENT")  
LIST = ()
LISTNUMBER2("CONTENT")

答案 1 :(得分:1)

另一种解决方案:

sed '/LIST = (/{:next;/)/{s/(.*)/()/;b;};N;b next;}'

这是一个不会更改任何包含某个字符串的块的版本(在本例中为“keepme”,但可以是任何内容):

sed '/LIST = (/{:next;/)/{/keepme/b;s/(.*)/()/;b;};N;b next;}'

由于这是之后的keepme测试,它会找到关闭括号,该标记可以在块中的任何位置。