2010-01-06 4 views
1

Мне нужно отменить всю строку в тексте с 5 символами символов подряд. Например:Обратная строка с 5 последовательными символами

hello hi adams sde 
abcde abs 

Требуемая мощность:

olleh hi smada sde 
edcba abs 

Я использовал:

sed -n 's\(a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)/\5\4\3\2\1/p' 

Он переворачивает нужны струны, кроме "Адамса". Пожалуйста, помогите мне исправить это.

+0

Почему голосовать, чтобы закрыть это? Возможно, не самый ясный сформулированный вопрос, который я видел, но я не вижу, как его можно охарактеризовать как «спам» ... –

ответ

1

Похоже, что это не так, что «adams» не заменяется, но ваша команда заменяет только первый соответствующий экземпляр. Попробуйте это:

sed -n 's/\([a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)/\5\4\3\2\1/pg' 

Из инструкции:

The s command can be followed by zero or more of the following flags: 
g Apply the replacement to all matches to the regexp, not just the first. 
(snip) 
+0

вы почти правы, спасибо :) sed -n 's/\\ ([ AZ] \\) \\ ([AZ] \\) \\ ([AZ] \\) \\ ([AZ] \\) \\ ([AZ] \\)/\ 5 \ 4 \ 3 \ 2 \ 1/pg ' – Leo

+0

Спасибо, отредактирован. –

+0

, так что если у вас есть строка типа «мощный», она будет «перечитана»? – ghostdog74

1

Использование AWK

awk '{ 
    for(i=1;i<=NF;i++) { 
     if(length($i)==5) { 
      v="" 
      for(o=length($i);o>0;o--) { 
       v=v substr($i,o,1) 
      } 
      $i=v 
     } 
    } 
}1' file 

выход

$ more file 
hello hi adams sde 
abcde abs 
$ ./shell.sh 
olleh hi smada sde 
edcba abs