2010-01-17 110 views
1

我是新來的Linux,我試圖解析一堆文件看起來如下 -結腸分離子列表

  • 一些文本
    • 啓動列表中的某些其他文本
      • 啓動sublist1
      • continue sublist1
    • 個更多的元素
    • 更elements2
      • 一個sublist2
        • 子sublist1

凡列表之前所有的空間是標籤。我需要一種方法來分析文本,這樣一個冒號加爲子列表...所以它看起來像在末尾以下內容:

  • 一些文字:
    • 啓動列表中的某些其他文本:
      • 開始sublist1
      • 繼續sublist1
    • 多個元素
    • 更elements2:
      • 一個sublist2:
        • 子sublist1
    • 另一元件

因此,當有冒號只添加一個可用的子列表。

我試圖尋找到sed和awk的命令,但我無法找到保存的上線的狀態,以便能夠在末尾添加冒號什麼。它不必在sed或awk中完成,我一直在嘗試這些,但沒有運氣。任何建議都會有所幫助。

+0

將此標記爲已回答如何? – stacker 2010-01-18 08:06:30

回答

1

財產以後像前人的精力解決您的問題:

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

我必須改變引號周圍的標籤爲雙引號,以使其適用於我:'「\ t」'但+1不使用數組(-1/2爲製表符特定而不是任何白色 - 空間)。 – 2010-01-17 14:34:06

+0

我修正了qoute issu,謝謝。空格的問題是還需要製表符來計算縮進。問題是關於如何保持前一行。 – stacker 2010-01-17 14:48:15

+0

非常感謝,這非常有幫助。 :) – 2010-01-18 04:48:07

1

一些嘗試

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 
+0

「更多elements2」應該在它後面有一個冒號,但它沒有得到一個冒號。 – 2010-01-17 13:53:40

+0

用於匹配和RSTART的+1(使用數組時爲-1/2) – 2010-01-17 14:35:59

0

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