我正在尝试使用sed脚本删除文件中数组的内容。我试图删除内容只留下括号()。但是我无法让sed脚本在多行上工作。
我正在尝试更改文件的当前状态:
LIST = ( "content"
"content1"
"content3")
到此:
LIST = ()
但是我使用的sed脚本只将文件更改为:
LIST = ()
"content"
"content1"
"content2"
sed -e 's/LIST=\([^)]*\)/LIST=() /g' filename
我还应该提到文件中还有其他一组括号,我不想受到影响。
e.g
LISTNUMBER2("CONTENT")
不应该被清空。
答案 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测试,它会找到关闭括号,该标记可以在块中的任何位置。