1

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

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

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

对此:

LIST = ()

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

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

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

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

例如

LISTNUMBER2("CONTENT")  

不应清空。

4

2 回答 2

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 -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")
于 2013-04-15T13:56:53.923 回答
1

另一个 sed 解决方案:

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

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

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

因为这会在找到右括号后进行 keepme 测试,该右括号表示标签可以位于块中的任何位置。

于 2013-04-15T14:10:35.563 回答