我是linux的新手,我正在尝试解析一堆看起来如下的文件 -
列表前面的所有空格都是制表符。我需要一种方法来解析文本,以便为子列表添加冒号...以便它在最后看起来像下面这样:
因此只有在有可用的子列表时才会添加冒号。
我尝试查看sed和awk命令,但我无法找到存储上一行状态的任何内容,以便能够在结尾处添加冒号。它不必在sed或awk中完成,我一直在尝试这些并且没有运气。任何建议都会有所帮助。
答案 0 :(得分: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;
}'
答案 1 :(得分: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
答案 2 :(得分: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