Вопрос по text – Использование sed для изменения только последовательных повторяющихся букв

1

Используя sed, как изменить букву «a»; до "A"; но только если он повторяется в виде двух или более последовательных букв. Пример из:

galaxy
ear
aardvak
Haaaaaaaaa 

в

galaxy
ear
AArdvak
HAAAAAAAAA 

Ваш Ответ

2   ответа
6

Вы можете сделать это с помощью групп. Если у вас есть этот файл:

$ cat a
galaxy
ear
aardvak
Haaaaaaaaa 
Ulaanbaatar

Вы можете использовать эту команду sed:

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

Что здесь происходит? Если у нас есть символ "упакован" в группе (\(.\)) и эта группа (\1) повторяется один или несколько раз (\1\{1,\}), затем замените соответствующую часть (&) его заглавной версией (\U&).

@strapakowsky я знаю! Я забыл, что это возможно с некоторой частотой, например. На самом деле, я просто вспомнил это сейчас, спустя несколько лет, читая ваш вопрос: D
+1 за использование\1 в части шаблона. Очень элегантное решение
Спасибо!! Идея использования\1 уже в первой частиs Команда приятная и необычная. Strapakowsky
2

EDIT
Вы можете сделать это с:

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/'

(Благодаряshelter)

Или с трубкой седа:

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.

Что это\U делать? Strapakowsky
Кроме того, вам не нужны все эти трубы, просто сделайтеsed 's/a../../;s/b.../.../;.....' Всем удачи.
это делает верхний регистр
Жаль, что вы удалили ответ с 25 трубками.
\ U работает в других seds. Порядок может быть другим, т.е.\1\U, Всем удачи.

Похожие вопросы