Разделение подсписков с двоеточием - PullRequest
1 голос
/ 17 января 2010

Я новичок в Linux и пытаюсь разобрать несколько файлов, которые выглядят следующим образом -

  • немного текста
    • начать список другого текста
      • start sublist1
      • продолжить подсписок1
    • больше элементов
    • больше элементов2
      • подсписок2
        • подсписок1

Где все пробелы перед списком являются вкладками. Мне нужен способ синтаксического анализа текста, чтобы добавить двоеточие для подсписков ... чтобы в конце оно выглядело следующим образом:

  • Некоторый текст:
    • начать список другого текста:
      • start sublist1
      • продолжить подсписок1
    • больше элементов
    • больше элементов2:
      • подсписок2:
        • подсписок1
    • другой элемент

Поэтому двоеточия добавляются только при наличии доступного подсписка.

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

Ответы [ 3 ]

1 голос
/ 17 января 2010

что-то попробовать

awk '
{
    A[d++]=$0
    match($0,"[^[:blank:]]")
    if ( RSTART > t ){    A[d-1]=A[d-1]":"  }
    else{  gsub(/:$/,"",A[d-2])  }
    t=RSTART
}
END{
    for(i=0;i<=d;i++){
        print A[i]
    }
} ' file

выход

$ cat file
Some text
        start list some other text
                start sublist1
                continue sublist1
        more elements
        more elements2
                a sublist2
                        a sub-sublist1
                                a sub-sublist2
        another element

$ ./shell.sh
Some text:
        start list some other text:
                start sublist1
                continue sublist1
        more elements
        more elements2
                a sublist2:
                        a sub-sublist1:
                                a sub-sublist2
        another element
1 голос
/ 17 января 2010

Что-то подобное может решить вашу проблему:

awk '
    function countTabs(line) {
        tabs=0;
        i=0;
        while( substr(line,i++,1) == "\t")
            tabs++;
        return tabs;
     }
{
    line1 = $0;
    while( getline line2) {
        if ( countTabs(line1) < countTabs(line2))
           printf("%s:\n" , line1);
        else
           printf("%s\n",line1);
        line1 = line2;
    }
    print line2;
}'
0 голосов
/ 17 января 2010

Эта модифицированная версия сценария ghostdog74 должна выполнить работу:

awk '
{
    A[NR]=$0
    match($0,"[^[:blank:]]")
    if ( RSTART > t ){ A[NR-1]=A[NR-1]":" }
    t=RSTART
}
END{
    for(i=1; i<=NR+1; i++){
        print A[i]
    }
} ' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...