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\'\nRun Code Online (Sandbox Code Playgroud)\n预期输出是:
\n1.Hi\n2.This \n3.a hugefil\n4.with repadcs\n5.per\n6.line\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n\n布莱
\n
echo "bleh" | grep -P \'^(?:([A-Za-z])(?!.*\\1))*$\'\nRun 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)