从以特定字符串开头的行中删除字符串

时间:2018-09-06 09:28:10

标签: bash awk sed

我有一个文件:

# Allow incoming TCP ports
TCP_IN = "20,21,22,25,53,80,110,143,443,4433,465,587,993,995,3306,9200,8080,8888,10000:20000,"

# Allow outgoing TCP ports
TCP_OUT = "20,21,22,25,53,80,110,113,143,443,465,4433,587,993,995,3306,9200,8080,8888,10000:20000,"

# Allow incoming UDP ports
UDP_IN = "20,21,53,111"

# Allow outgoing UDP ports
# To allow outgoing traceroute add 33434:33523 to this list 
UDP_OUT = "20,21,53,113,123,111"

# Allow incoming PING. Disabling PING will likely break external uptime
# monitoring
ICMP_IN = "1"

我想删除,假设从443开头的行开始TCP_OUT = ",而不是文件中其他任何地方。

我正在寻找一种sedawk解决方案。

说明: 我不想删除以特定字符串开头的整行,而是要删除以字符串开头的行中的子字符串。例如:我只想删除以443开头的行中的TCP_OUT = "我不想删除以TCP_OUT = "开头的整行

3 个答案:

答案 0 :(得分:0)

使用sed中的“地址”仅在特定行上进行替换:

sed '/^TCP_IN /s/\([",]\)443[",]/\1/'

需要[",]才能正确处理列表中的第一项或最后一项为443的情况。

答案 1 :(得分:0)

您可以使用以下sed命令:

sed -iE '/^TCP_OUT /s/"443"/""/; s/([",])443,|,443([,"])/\1\2/' file

sed检查所有4种可能的情况:

  • 443是输入中的唯一数字,即"443"
  • 443开始时,即"443,111,222,333"
  • 443结尾时,即"987,546,443"
  • 443位于中间时,即"111,222,333,443,678,123,098"

答案 2 :(得分:0)

使用sed:

sed '/^TCP_OUT/ s/443,*//' file