Sed删除由包含关键字的行指示的MAC地址

Sed删除由包含关键字的行指示的MAC地址,sed,mac-address,Sed,Mac Address,我正在用包含特定字符的行混淆文件中的MAC地址。但是,我只想在事件关键字指示的行中删除它。对我来说,最困难的是,在偶数关键字和MAC地址之间会有随机长度的关键字,包括数字和字母。 因此,我将替换为: [random length combinations of words, numbers, potentially punctuation or space] "event" [random length combinations of words, numbers, potentially pu

我正在用包含特定字符的行混淆文件中的MAC地址。但是,我只想在事件关键字指示的行中删除它。对我来说,最困难的是,在偶数关键字和MAC地址之间会有随机长度的关键字,包括数字和字母。 因此,我将替换为:

[random length combinations of words, numbers, potentially punctuation or space] "event" [random length combinations of words, numbers, potentially punctuation or space] "xx:xx:xx:xx:xx:xx" [random length combinations of words, numbers, potentially punctuation, nothing at all or space] 
到一个x 我只知道如何混淆MAC地址:

sed -E 's/'([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}')/ x /g'
但我不知道如何修改它,使它对特定的行混淆。例如,我有一个文件input.txt:

[INFO] device 1 event - client connected with aa:bb:8a:de:8e:23
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: aa:bb:8a:de:8e:23 success!
输出应为:

[INFO] device 1 event - client connected with x
[ERROR] device 2 event - routing data to x failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: x success!
这里有一个可能的sed解决方案——它允许事件出现在线路的任何地方,它必须是一个完整的字,而不是较长的字的一部分,如eventful,并且一条线路上可能有多个MAC地址——如果单词event出现在同一线路上,则所有这些地址都必须被屏蔽。我也使用xx:xx:xx:xx:xx:xx作为遮罩,但是你可以很容易地替换它

我创建了以下用于测试的输入文件:

$ cat mac.input

[INFO] device 1 event - client connected with aa:bb:8a:de:8e:23
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: aa:bb:8a:de:8e:23 success!
[LINE] this was an eventful evening 22:33:22:33:22:33
[TWO MAC ADDRESSES] aa:bb:aa:33:dd:1f is event 99:33:00:23:43:83 good
正如我已经提到的,即使存在单词event,第二行的地址也不会被屏蔽,因为该地址不是以-g不是十六进制数字开头的有效MAC地址。[LINE]行上的地址不会被屏蔽,因为即使是eventful,单词event本身也不存在。最后一行有两个MAC地址,我把它们都屏蔽了——甚至是在单词event之前出现的那个地址。我在评论中要求你澄清这种情况是否可能,如果可能,必须如何处理;在这里,我只是做了一个随机选择,以显示什么是可能的

下面是sed命令及其输出:

$ sed -E '/\bevent\b/
>   s/([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}/xx:xx:xx:xx:xx:xx/g' mac.input 

[INFO] device 1 event - client connected with xx:xx:xx:xx:xx:xx
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: xx:xx:xx:xx:xx:xx success!
[LINE] this was an eventful evening 22:33:22:33:22:33
[TWO MAC ADDRESSES] xx:xx:xx:xx:xx:xx is event xx:xx:xx:xx:xx:xx good
这里有一个可能的sed解决方案——它允许事件出现在线路的任何地方,它必须是一个完整的字,而不是较长的字的一部分,如eventful,并且一条线路上可能有多个MAC地址——如果单词event出现在同一线路上,则所有这些地址都必须被屏蔽。我也使用xx:xx:xx:xx:xx:xx作为遮罩,但是你可以很容易地替换它

我创建了以下用于测试的输入文件:

$ cat mac.input

[INFO] device 1 event - client connected with aa:bb:8a:de:8e:23
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: aa:bb:8a:de:8e:23 success!
[LINE] this was an eventful evening 22:33:22:33:22:33
[TWO MAC ADDRESSES] aa:bb:aa:33:dd:1f is event 99:33:00:23:43:83 good
正如我已经提到的,即使存在单词event,第二行的地址也不会被屏蔽,因为该地址不是以-g不是十六进制数字开头的有效MAC地址。[LINE]行上的地址不会被屏蔽,因为即使是eventful,单词event本身也不存在。最后一行有两个MAC地址,我把它们都屏蔽了——甚至是在单词event之前出现的那个地址。我在评论中要求你澄清这种情况是否可能,如果可能,必须如何处理;在这里,我只是做了一个随机选择,以显示什么是可能的

下面是sed命令及其输出:

$ sed -E '/\bevent\b/
>   s/([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}/xx:xx:xx:xx:xx:xx/g' mac.input 

[INFO] device 1 event - client connected with xx:xx:xx:xx:xx:xx
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: xx:xx:xx:xx:xx:xx success!
[LINE] this was an eventful evening 22:33:22:33:22:33
[TWO MAC ADDRESSES] xx:xx:xx:xx:xx:xx is event xx:xx:xx:xx:xx:xx good

有几个问题。我们能否总是假设单词event总是出现在MAC地址之前?一条线路上会有多个MAC地址吗?我们只关心那些里面也有event这个词的行。event必须是一个完整的单词,还是仅仅是一个子字符串,比如eventful?我想这一定是一个完整的单词,但请确认。而且,您希望MAC地址仅替换为x,而不是xx:xx:xx:xx:xx:xx?请注意示例中的一个错误:g不是十六进制数字。所以gg:7a:。。。不会在[ERROR]行中屏蔽。不确定这是否只是您键入示例时的一个错误,或者您是否故意使用g来显示输入中可能存在的错误。如果发生这种情况,应该如何处理?@mathguy是的,我们可以假设事件发生在MAC地址之前。据我所知,不会同时有两个MAC地址。事件必须是完整的单词,而不是子字符串。是的,我想用一个x代替这个地址,而不是完整的地址。很抱歉,我在匆忙中举了个例子。在实际文件中,MAC地址将全部为十六进制。如果有其他字符串恰好具有这种格式,而不是十六进制数xx:xx:xx:xx:xx:xx:xx,我们将忽略它。谢谢你对几个问题的关注。我们能否总是假设单词event总是出现在MAC地址之前?一条线路上会有多个MAC地址吗?我们只关心那些里面也有event这个词的行。event必须是一个完整的单词,还是仅仅是一个子字符串,比如eventful?我想这一定是一个完整的单词,但请确认。而且,您希望MAC地址仅替换为x,而不是xx:xx:xx:xx:xx:xx?请注意示例中的一个错误:g不是十六进制数字。所以gg:7a:。。。不会在[ERROR]行中屏蔽。不确定这是否只是您键入示例时的一个错误,或者您是否故意使用g来显示输入中可能存在的错误。如果发生这种情况,应该如何处理?@mathguy是的,我们可以假设事件发生在MAC地址之前。据我所知,不会同时有两个MAC地址。事件必须是完整的单词,而不是子字符串。和
是的,我想用一个x代替这个地址,而不是完整的地址。很抱歉,我在匆忙中举了个例子。在实际文件中,MAC地址将全部为十六进制。如果有其他字符串恰好具有这种格式,而不是十六进制数xx:xx:xx:xx:xx:xx:xx,我们将忽略它。谢谢大家对细节的关注,非常感谢!这是一个非常全面的解决方案!嗨,我有一个后续问题。现在由于某些情况,我需要以字符串格式存储所有cli命令。因此,当我把这个命令放在一个字符串中时,我将它转换成sed-E'/\\bevent\\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx/g',但它现在不起作用。那么,您能告诉我如何将他的命令转换成字符串格式吗?@ImTrying-我不确定您要转换成什么类型的字符串。具体来说,为什么需要将后斜线加倍?还有谁先解释它们?我认为一个可能的答案是没有人,所以你首先不需要这样做。您是否尝试按原样保存字符串?还有一个问题:我想我问了,你回答说你真的想用xxx替换-但是现在我看到你用的是xx:xx:xx:xx:xx。你改变主意了吗?所以我有:int boolInt=-1;boolInt=snprintfcmd,256%s | sed-E'/\bevent\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/*/g'| gzip-c | base64>\%s\,信息文件,文件;抱歉,我不太清楚您所说的“保存字符串”是什么意思。我试着做一个简单的实验,看看这个命令是否可以直接打印出来:printfsed-E'/\bevent\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx/g'已经向我显示了:sed-E'/event/s/[:xdigit:][:xdigit:]{2}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx:xx:xx:xx/g'但是printfsed-E'/]/xx:xx:xx:xx:xx:xx/g'向我显示了:sed-E'/\bevent\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx/g',所以我认为使用后者是正确的方法,非常感谢!这是一个非常全面的解决方案!嗨,我有一个后续问题。现在由于某些情况,我需要以字符串格式存储所有cli命令。因此,当我把这个命令放在一个字符串中时,我将它转换成sed-E'/\\bevent\\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx/g',但它现在不起作用。那么,您能告诉我如何将他的命令转换成字符串格式吗?@ImTrying-我不确定您要转换成什么类型的字符串。具体来说,为什么需要将后斜线加倍?还有谁先解释它们?我认为一个可能的答案是没有人,所以你首先不需要这样做。您是否尝试按原样保存字符串?还有一个问题:我想我问了,你回答说你真的想用xxx替换-但是现在我看到你用的是xx:xx:xx:xx:xx。你改变主意了吗?所以我有:int boolInt=-1;boolInt=snprintfcmd,256%s | sed-E'/\bevent\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/*/g'| gzip-c | base64>\%s\,信息文件,文件;抱歉,我不太清楚您所说的“保存字符串”是什么意思。我试着做一个简单的实验,看看这个命令是否可以直接打印出来:printfsed-E'/\bevent\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx/g'已经向我显示了:sed-E'/event/s/[:xdigit:][:xdigit:]{2}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx:xx:xx:xx/g'但是printfsed-E'/]/xx:xx:xx:xx:xx:xx/g'向我显示了:sed-E'/\bevent\b/s/[:xdigit:]{2}:{5}[:xdigit:]{2}/xx:xx:xx:xx:xx:xx/g',因此我认为使用后者是正确的方法