删除字符串前后的文本,但有限制器

时间:2018-04-08 03:18:48

标签: string text awk sed

我使用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'

最好的方法是什么?

感谢关注

6 个答案:

答案 0 :(得分:0)

cat $dhcp | tr '\n' '\r' | sed -e "s/\r\r.*'string'.*\r\r/\r\r/" | tr '\r' '\n'

解释

  1. tr '\n' '\r'
    \n替换为\r,以允许sed使用“中断行”。
  2. sed -e "s/\r\r.*'string'.*\r\r/\r\r/":用空字符串替换出现'string'及其兄弟字符,直到找到双断行。
  3. tr '\r' '\n'
    通过\r
  4. 改回\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,则删除这些行,否则打印它们。