正则表达式和/或sed替换小写

时间:2017-04-24 15:13:09

标签: bash awk sed

我有一个包含单列数据的文本文件。以下面的数据为例

united states
germany
france
canada

其中我试图生成所有可能的混合大小写变体。例如,新文件可能如下所示

United states
uNited states
unIted states
uniTed states
unitEd states
uniteD stated
united States
united sTates
united stAtes
united staTes
united statEs
united stateS
UNited states

依此类推,直到生成每个单词的所有可能的案例变体。

鉴于上述输入和预期输出我有三个问题

  1. 正则表达式和sed是这项工作的正确工具吗?
  2. 我有什么替代品可以用于此任务的正则表达式和sed?
  3. 如果我确实使用了正则表达式和sed,那么正确的语法是什么样的?

2 个答案:

答案 0 :(得分:2)

1)否

2)awk和substr()

3)你不会

从这开始:

$ echo 'foo' |
awk '{
    for (i=1;i<=length($0);i++) {
        print substr($0,1,i-1) toupper(substr($0,i,1)) substr($0,i+1)
    }
}'
Foo
fOo
foO

按摩以适应明显的逻辑。

答案 1 :(得分:1)

为了sed的乐趣。

1)是的。 (例如GNU sed版本4.2.1)
2)也许awk,perl
3)见下面的代码

sed -E "s/^.*$/\n&#\n/;:a;s/\n([^#\n]*)([^#\n])#([^#\n]*)\n/\n\1#\u\2\3\n\1#\l\2\3\n/;ta;s/(^\n#|\n$)//g;s/\n#/\n/g;"

这确实假设&#34;#&#34;不是文件中找到的字符串的一部分。

  • 创建一定的模式
    (以换行符开头和结尾;用#标记光标)
  • 开始循环
    • 在换行符之间替换文本并将光标包含两次相同的文本,
      一次用光标前的大写字母,一次用小写字母
    • 将光标移向开头
    • 循环,如果它取代了某些东西
  • 删除开头和结尾的新行以及游标

请注意,#并不特别。它只需要是一个不会在输入中出现而不是在所需输出中的字符。希望你能找到一个特殊的角色 如果你可以拥有所有角色,那就太复杂了。看看这个答案的评论。可能正在进行讨论。

输出(输入&#34; foo&#34;):

FOO
fOO
FoO
foO
FOo
fOo
Foo
foo