Добавление пустой строки между текстовыми группами через отдельный префикс - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь отсортировать и сгруппировать определенные программные операторы в порядке возрастания для облегчения чтения исходного кода.До сих пор я мог извлечь эти программные операторы и отсортировать их в порядке возрастания, используя sort.

Несколько примеров:

# Example 1
keyword ABC;
keyword ABC.DEF;
keyword ABC.GHI;
keyword ABC.JKL.MNO;
keyword ZYX;
keyword ZYX.RST;
keyword ZYX.WVU;

# Example 2
keyword ABC;
keyword ABC.DEF;
keyword ABC.GHI;
keyword ABC.JKL.MNO;

# Example 3
keyword ZYX;
keyword ZYX.RST;
keyword ZYX.WVU;

Каждая строка начинается с keyword, за которым следуетпробел и текст, который может быть разделен на несколько частей точкой.Я хотел бы добавить пустую строку между последней строкой, начинающейся с keyword ABC, и первой строкой, начинающейся с keyword ZYX.Но не гарантируется, что будет хотя бы одна строка, начинающаяся с keyword ABC, и одна строка, начинающаяся с keyword ZYX.

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Если вы используете GNU sed и файлы достаточно короткие, простое решение для многострочного замещения - использовать флаг -z:

sed -zE 's/(keyword ABC[^\n]*\n)(keyword ZYX)/\1\n\2/'

Установлен флаг -z, чтобы sed игнорировал перевод строки и использовал \0 в качестве разделителя записей, чтобы весь файл читался как одна запись (поэтому они не должны быть слишком большими) и \n могут быть сопоставлены. Затем мы подставляем две последовательные строки «ключевое слово ABC» и «ключевое слово ZYX», добавляя дополнительный перевод строки между ними.

Вы можете попробовать здесь .

1 голос
/ 24 мая 2019

Предполагая, что строки помещены в файл с именем input.txt, следующий код решит проблему:

last_first="0";
cat input.txt | while read line; do
    text=$(echo $line | awk '{print $2}');
    first=${text:0:1}
    if [ "$last_first" = "0" ]; then
        last_first="$first";
    elif [ "$last_first" != "$first" ]; then
        echo;
        last_first="$first";
    fi
    echo $text; 
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...