mar*_*rio 2 regex awk replace sed sh
我想在 Shell 脚本 ( sh
) 中使用正则表达式在每行中获取唯一的字符。\n换句话说,我想删除每行中任何进一步出现的字符。
我正在尝试回答这个问题:\n“每行中出现哪些字符? ”
\n例如,我正在尝试做这样的事情:
\necho \'1.Hi\n2.This is\n3.a huge file\n4.with repeated chars\n5.per\n6.line\' | sed \'s/MYSTERIOUS_REGEX/MYSTERIOUS_REPLACE/g\'\n
Run Code Online (Sandbox Code Playgroud)\n预期输出是:
\n1.Hi\n2.This \n3.a hugefil\n4.with repadcs\n5.per\n6.line\n
Run Code Online (Sandbox Code Playgroud)\n这是解释:
\ni
\'、\' s
\'重复
\'、\' e
\'重复e
\'、\'\ a
'、\'\ t
'、\'\ e
'、\'\' d
、\'
\'、\'\ c
'、\'\ h
'、\' a
\'、\' r
\'重复OBS:
\nsh
并sed
获得 5\xe2\xad\x90sbash
,awk
您将获得 3\xe2\xad\x90s\xcc\xb6D\xcc\xb6i\xcc\xb6s\xcc\xb6t\xcc\xb6r\xcc\xb6a\xcc\xb6c\xcc\xb6t\xcc\xb6o\xcc\xb6r\xcc\xb6\xcc\xb6提示:
\n以下正则表达式匹配没有重复字符的行:^(?:([A-Za-z])(?!.*\\1))*$
1.Hi\n2.This \n3.a hugefil\n4.with repadcs\n5.per\n6.line\n
Run Code Online (Sandbox Code Playgroud)\n\n\n布莱
\n
echo "bleh" | grep -P \'^(?:([A-Za-z])(?!.*\\1))*$\'\n
Run Code Online (Sandbox Code Playgroud)\n\n\n(空的)
\n
您可以使用这个gnu-sed
解决方案:
sed -E ':a;s/((.).*)\2/\1/;ta' file
1.Hi
2.This
3.a hugefil
4.with repadcs
5.per
6.line
Run Code Online (Sandbox Code Playgroud)
替代的awk
非正则表达式解决方案(应该适用于任何 awk 版本):
awk '{
delete seen
for (i=1; i<=length(); ++i) {
ch = substr($0,i,1)
if (!seen[ch]++) printf "%s", ch
}
print ""
}' file
1.Hi
2.This
3.a hugefil
4.with repadcs
5.per
6.line
Run Code Online (Sandbox Code Playgroud)