1

使用 sed,如何将字母“a”更改为“A”,但前提是它作为两个或多个连续字母重复出现。示例,来自:

galaxy
ear
aardvak
Haaaaaaaaa 

进入

galaxy
ear
AArdvak
HAAAAAAAAA 
4

2 回答 2

7

您可以使用组来完成。如果你有这个文件:

$ cat a
galaxy
ear
aardvak
Haaaaaaaaa 
Ulaanbaatar

你可以使用这个 sed 命令:

$ sed 's/\(.\)\1\{1,\}/\U&/g' a
galaxy
ear
AArdvak
HAAAAAAAAA 
UlAAnbAAtar

这里会发生什么?如果我们有一个字符,“打包”在一个组 ( \(.\)) 中,并且该组 ( \1) 重复一次或多次 ( \1\{1,\}),则将匹配的部分 ( &) 替换为其大写版本 ( \U&)。

于 2012-06-05T16:13:47.410 回答
2

编辑
您可以这样做:

sed 's/a\(a\+\)/A\U\1/;s/b\(b\+\)/B\U\1/;s/c\(c\+\)/C\U\1/;s/d\(d\+\)/D\U\1/;s/e\(e\+\)/E\U\1/;s/f\(f\+\)/F\U\1/;s/g\(g\+\)/G\U\1/;s/h\(h\+\)/H\U\1/;s/i\(i\+\)/I\U\1/;s/j\(j\+\)/J\U\1/;s/k\(k\+\)/K\U\1/;s/l\(l\+\)/L\U\1/;s/m\(m\+\)/M\U\1/;s/n\(n\+\)/N\U\1/;s/o\(o\+\)/O\U\1/;s/p\(p\+\)/P\U\1/;s/q\(q\+\)/Q\U\1/;s/r\(r\+\)/R\U\1/;s/s\(s\+\)/S\U\1/;s/t\(t\+\)/T\U\1/;s/u\(u\+\)/U\U\1/;s/v\(v\+\)/V\U\1/;s/w\(w\+\)/W\U\1/;s/x\(x\+\)/X\U\1/;s/y\(y\+\)/Y\U\1/;s/z\(z\+\)/Z\U\1/'

(感谢庇护所

或者使用 sed 管道:

function capitalize_consecutives () {
  sed 's/a\(a\+\)/A\U\1/' |
  sed 's/b\(b\+\)/B\U\1/' |
  sed 's/c\(c\+\)/C\U\1/' |
  sed 's/d\(d\+\)/D\U\1/' |
  sed 's/e\(e\+\)/E\U\1/' |
  sed 's/f\(f\+\)/F\U\1/' |
  sed 's/g\(g\+\)/G\U\1/' |
  sed 's/h\(h\+\)/H\U\1/' |
  sed 's/i\(i\+\)/I\U\1/' |
  sed 's/j\(j\+\)/J\U\1/' |
  sed 's/k\(k\+\)/K\U\1/' |
  sed 's/l\(l\+\)/L\U\1/' |
  sed 's/m\(m\+\)/M\U\1/' |
  sed 's/n\(n\+\)/N\U\1/' |
  sed 's/o\(o\+\)/O\U\1/' |
  sed 's/p\(p\+\)/P\U\1/' |
  sed 's/q\(q\+\)/Q\U\1/' |
  sed 's/r\(r\+\)/R\U\1/' |
  sed 's/s\(s\+\)/S\U\1/' |
  sed 's/t\(t\+\)/T\U\1/' |
  sed 's/u\(u\+\)/U\U\1/' |
  sed 's/v\(v\+\)/V\U\1/' |
  sed 's/w\(w\+\)/W\U\1/' |
  sed 's/x\(x\+\)/X\U\1/' |
  sed 's/y\(y\+\)/Y\U\1/' |
  sed 's/z\(z\+\)/Z\U\1/' 
}

然后让它解析你的文件:

capitalize_consecutives < myfile

\U是大写出现。我想这仅适用于 GNU sed。

于 2012-06-05T15:07:19.340 回答