sed 正则表达式,匹配不同分隔符之间的第一个实例

问题描述 投票:0回答:1

我有一组想要匿名的哈希值。使用 GNU sed (v4.9),如何仅用其他内容替换部分散列?特别针对我的情况,我想保留

$
符号(如果存在),但前提是它直接位于
:
前面。

示例:

USER:1234:aad3b435b:abcdef:::
COMPUTER$:4321:aad3b435b:abcdef:::
DOMAIN\bleh:5678:eaad3b4:fedcba:::
DOMAIN\$why:5678:eaad3b4:fedcba:::

使用以下命令我几乎能够得到我想要的

sed 's/[^$:]\+/REDACTED/1'
REDACTED:1234:aad3b435b:abcdef:::
REDACTED$:4321:aad3b435b:abcdef:::
REDACTED:5678:eaad3b4:fedcba:::
REDACTED$why:5678:eaad3b4:fedcba:::

但是,可以看出,这个 sed 正则表达式与最后一个条目的匹配错误。应该是

REDACTED:5678:eaad3b4:fedcba:::

sed 命令应该替换行开头

^
$:
OR
:
之间的任何内容。

我不知道我做错了什么。我已经尝试过使用分组、前瞻/后视和转义字符来使“or”子句正常工作,但我无法得到我想要的结果。据我了解 sed 默认情况下使用基本的正则表达式,但我似乎无法使用

-E
-r
找到解决方案...

regex bash sed replace delimiter
1个回答
1
投票

这对我有用:

$ sed 's/[^:]*[^$:]/REDACTED/' file
REDACTED:1234:aad3b435b:abcdef:::
REDACTED$:4321:aad3b435b:abcdef:::
REDACTED:5678:eaad3b4:fedcba:::
REDACTED:5678:eaad3b4:fedcba:::
© www.soinside.com 2019 - 2024. All rights reserved.