我使用sed删除包含特定字词的行:
string=${line##* }
sed "/$string/d" $dhcp
这样做的不便之处在于,我无法安全地删除部分文本。
理想看起来像这样:
例如: 输入:
config host
mac '00:a0:00:00:00:00'
option name 'laptop1'
option dns '1'
config host
option mac '00:a0:00:00:00:00'
option name 'string'
option dns '1'
config host
option name 'laptop3'
mac '00:a0:00:00:00:00'
option dns '1'
输出
config host
option mac '00:a0:00:00:00:00'
option name 'laptop1'
option dns '1'
config host
option name 'laptop3'
mac '00:a0:00:00:00:00'
option dns '1'
最好的方法是什么?
感谢关注
答案 0 :(得分:0)
cat $dhcp | tr '\n' '\r' | sed -e "s/\r\r.*'string'.*\r\r/\r\r/" | tr '\r' '\n'
解释
tr '\n' '\r'
:\n
替换为\r
,以允许sed
使用“中断行”。sed -e "s/\r\r.*'string'.*\r\r/\r\r/"
:用空字符串替换出现'string'
及其兄弟字符,直到找到双断行。tr '\r' '\n'
:\r
\n
醇>
答案 1 :(得分:0)
关注awk
可能对您有帮助。
awk '/config host/{if(val){print val};non_flag=val=""} /option name \047string\047/{non_flag=1;val=""} !non_flag && NF{val=val?val ORS $0:$0} END{if(val){print val}}' Input_file
现在也添加非单线形式的解决方案。
awk '
/config host/{
if(val){
print val};
non_flag=val=""
}
/option name \047string\047/{
non_flag=1;
val=""
}
!non_flag && NF{
val=val?val ORS $0:$0
}
END{
if(val){
print val}
}' Input_file
说明: 现在也为上述代码添加说明。
awk '
/config host/{ ##Searching for text config host in a line if it is there then do following.
if(val){ ##If variable val is NOT NULL then do following.
print val}; ##printing the value of variable val here.
non_flag=val="" ##Nullifying the variables non_flag and val here.
}
/option name \047string\047/{ ##Searching for string option name 'string' here if it is found then do following.
non_flag=1; ##Setting up the value of variable non_flag as 1 here.
val="" ##Nullifying the variable named val here.
}
!non_flag && NF{ ##Checking conditions if variable non_flag is NULL and line is NOT a empty line then do following.
val=val?val ORS $0:$0 ##Create variable named val and each time cursor comes here concatenate its value with its own value.
}
END{ ##Starting END section of awk code here.
if(val){ ##Checking if variable val is NOT NULL then do following,
print val} ##Printing variable val value here.
}' Input_file ##Mentioning Input_file name here.
注意: 如果您的Input_file是一个shell变量,从您的帖子看起来如此,则从Input_file
更改为"$dhcp"
。
答案 2 :(得分:0)
** awk **
1)
RS="config host"
2)
- 将记录分隔符设置为想要的字符串。
-v str1=$str1
$str1=laptop1
获取参数(在记录的字符串中搜索字符串,在我们的例子中为3)
)。
($0!~str1)&&(NR>1)
$str
- 不包含4)
字符串的记录。
{printf "%s",RS $0 }
{{1}} - 打印记录分隔符和记录的字符串
答案 3 :(得分:0)
你可以试试这个gnu sed
sed '/./!d;:A;$bB;N;/\n$/!bA;:B;/string/d' infile
答案 4 :(得分:0)
sed用于对单个输入行进行s/old/new/
全部。虽然它有一百万个神秘的角色组合来做其他的事情,但是在80年代中期发明awk时所有这些都变得过时了,除非他们是受虐狂的人们今天只使用它们进行心理锻炼,而不是真正的代码。
$ awk -v RS= -v ORS='\n\n' '!/string/' file
config host
mac '00:a0:00:00:00:00'
option name 'laptop1'
option dns '1'
config host
option name 'laptop3'
mac '00:a0:00:00:00:00'
option dns '1'
$ awk -v RS= -v ORS='\n\n' '!/laptop1/' file
config host
option mac '00:a0:00:00:00:00'
option name 'string'
option dns '1'
config host
option name 'laptop3'
mac '00:a0:00:00:00:00'
option dns '1'
答案 5 :(得分:0)
这可能适合你(GNU sed):
SELECT TOP 1 * FROM [Part]
ORDER BY LEN(LongDescription_c) DESC
将以sed '/config host/{:a;N;/^\s*$/M!ba;/string/d}' file
开头的行收集到空行。如果这些行包含config host
,则删除这些行,否则打印它们。