2

Я хотел бы сделать полное переформатирование наших тестов, и я убираю некоторую непоследовательную капитализацию. Я думаю об использовании awk для этого, так как sed немного не хватает, и так как мне нужно заглянуть в мой случай. В частности, для каждой строки в данном файле я хочу, чтобы произошло следующее:

  • Найдите слово it , describe или context , за которым следует пробел, за которым следует одинарная или двойная кавычка, за которой следует буквенный символ в верхнем регистре.

  • Если есть совпадение, замените совпадение строчной версией всей совпадающей строки, но только совпадающей строкой (не строчные буквы других элементов в той же строке).

  • Не совпадайте, если строка после одинарной или двойной кавычки имеет значение "GET", "POST", "PUT" или "DELETE".

Так, например:

describe 'apple banana'       ----> (no change)
describe 'APPLE BANANA'       ----> describe 'aPPLE BANANA'
describe 'Apple Banana'       ----> describe 'apple Banana'
describe "Apple Banana"       ----> describe "apple Banana"
describe 'one TWO'            ----> (no change)

context 'POST BANANA'         ----> (no change)
context 'XPOST BANANA'        ----> context 'xPOST BANANA'

Какие аргументы awk и / или другие команды я должен использовать? (Со мной все в порядке, если для этого требуется более одного прохода.)

1 ответ1

3

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:

Это решение удалит все "лишние" пробелы в строках, которые будут заменены. Например...:

      describe           'Apple           Banana'

... будет заменено на:

 describe 'apple Banana'

Тем не менее, "лишние" пробелы в ...:

            context      "GET  BANANA"

... не будет удален.


Вот пример в awk по запросу (обратите внимание, что вы можете выполнить команду в одной строке. Разрывы строки предназначены только для визуальной привлекательности в Super User):

cat someTextFile.txt | awk '{ \
    if( \
        ($1=="describe" || $1=="it" || $1=="context") \
         && (substr($2,0,1)=="\"" || substr($2,0,1)=="'"'"'") \
         && !(substr($2,2,length($2)-1)=="POST" \
              || substr($2,2,length($2)-1)=="GET" \
              || substr($2,2,length($2)-1)=="PUT" \
              || substr($2,2,length($2)-1)=="DELETE") \
       ){ \
          subStr=substr($2,0,1); \
          subStr2=tolower(substr($2,2,1)); \
          restStr=substr($2,3,length($2)-1); \
          print $1" "subStr""subStr2""restStr" "$3 \
        }else{ \
          print \
        } \
     }' 

ВЫХОД:

 describe 'apple banana'
 describe 'aPPLE BANANA'
 describe 'apple Banana'
 describe "apple Banana"
 describe 'one TWO'

 context 'POST BANANA'
 context 'xPOST BANANA'

РЕДАКТИРОВАТЬ: вот команда без разрыва строки cat someTextFile.txt | awk '{ if( ($1=="describe" || $1=="it" || $1=="context") && (substr($2,0,1)=="\"" || substr($2,0,1)=="'"'"'") && !(substr($2,2,length($2)-1)=="POST" || substr($2,2,length($2)-1)=="GET" || substr($2,2,length($2)-1)=="PUT" || substr($2,2,length($2)-1)=="DELETE") ){ subStr=substr($2,0,1); subStr2=tolower(substr($2,2,1)); restStr=substr($2,3,length($2)-1); print $1" "subStr""subStr2""restStr" "$3}else{print}}'

Если вы хотите записать вывод в новый файл, просто добавьте > output.txt в конце команды.

Если вы хотите выполнить это для нескольких файлов и сохранить результат в одном текстовом файле, просто cat someFile.txt командой cat которая выполняется для файлов, которые вы хотите отформатировать, например, с помощью cat *log* или cat $(find /some/path -name "*log*")

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Большое спасибо Скотт за отзыв!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .