sed 提取每行中的唯一字符

mar*_*rio 2 regex awk replace sed sh

我想在 Shell 脚本 ( sh) 中使用正则表达式在每行中获取唯一的字符。\n换句话说,我想删除每行中任何进一步出现的字符。

\n

我正在尝试回答这个问题:\n“每行中出现哪些字符?

\n

例如,我正在尝试做这样的事情:

\n
echo \'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

预期输出是:

\n
1.Hi\n2.This \n3.a hugefil\n4.with repadcs\n5.per\n6.line\n
Run Code Online (Sandbox Code Playgroud)\n

这是解释:

\n
    \n
  • 第 1 行:没有任何重复的字符
  • \n
  • 第 2 行:\' i\'、\' s\'重复
  • \n
  • 第 3 行:\' \'、\' e\'重复
  • \n
  • 第 4 行:\' e\'、\'\ a'、\'\ t'、\'\ e'、\'\' d、\' \'、\'\ c'、\'\ h'、\' a\'、\' r\'重复
  • \n
  • 5号线:没有任何重复的字符
  • \n
  • 第 6 行:没有任何重复的字符
  • \n
\n

OBS

\n
    \n
  • 如果您使用以下方法实现此目的shsed获得 5\xe2\xad\x90s
  • \n
  • 如果您使用其他工具( 等)实现此目的bashawk您将获得 3\xe2\xad\x90s
  • \n
\n
\n

\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))*$

\n
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
\n
\n

anu*_*ava 6

您可以使用这个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)

  • 也许 `sed -E ':a;s/((.).*)\2/\1/;ta' file` 中的 `g` 标志是不必要的,因为 `.*` 是贪婪的,因此可以向后工作线。 (2认同)