在bash中解析标记文件以获取所有缩进行及其在文件中的位置

在bash中解析标记文件以获取所有缩进行及其在文件中的位置,bash,markdown,fileparsing,Bash,Markdown,Fileparsing,我正在尝试在bash中获取标记文件中的所有缩进行。我需要它们在文件中的位置,以便以后能够在原始位置再次提取或插入它们 下面是一个标记文件的示例,我希望获得该文件的所有缩进行 # Example bloc code This is a bloc code function display_results() { awk '{print $0; system("sleep .5");}' $1 rm $1 } This cod

我正在尝试在bash中获取标记文件中的所有缩进行。我需要它们在文件中的位置,以便以后能够在原始位置再次提取或插入它们

下面是一个标记文件的示例,我希望获得该文件的所有缩进行

# Example bloc code

This is a bloc code

    function display_results() {
        awk '{print $0; system("sleep .5");}' $1
        rm $1
    }

This code displays results.

below an other example of bloc code

    echo "------------------------------------------"
    echo "              TEST RESULTS"
    echo "------------------------------------------"

Or just one line:

    System.out.println("foo");

blablablab
因为我想知道bloc的位置,所以我逐行解析文件,并查看该行是否使用正则表达式缩进

注意:提到regex不是获取bloc代码的正确工具,因为可能会嵌套bloc代码。我不必处理这个用例,只获取上面示例中所示的普通bloc代码就足够了

我的代码是:

#我测试过的正则表达式之一
正则表达式='^[:blank:]+'#找不到任何行
读行时;做
#尝试使用正则表达式查找缩进行
如果[[$line=~$regex]];然后
回显“缩进:$line”
其他的
回显“文本:$line”
fi
完成<$testFile
其中,
$testFile
是我解析的标记文件

现在,我写的最好的正则表达式(基于这个和这个)只匹配一些行,但不是全部

以下面的正则表达式为例,我只得到一些行,但不是全部:

regexblank=“[^a-zA-Z#]+[[:blank:][]
regexspace=“[^a-zA-Z#]+[[:space:]”
blank=“[^a-zA-Z#]+[[:blank:][]
使用上面的正则表达式,结果是:

TEXT: # Example bloc code
TEXT:
TEXT: This is a bloc code
TEXT:
INDENTED: function display_results() {
INDENTED: awk '{print main.sh; system("sleep .5");}'
TEXT: rm
TEXT: }
TEXT:
TEXT: This code displays results.
TEXT:
TEXT: below an other example of bloc code
TEXT:
TEXT: echo "------------------------------------------"
INDENTED: echo "              TEST RESULTS"
TEXT: echo "------------------------------------------"
TEXT:
TEXT: Or just one line:
TEXT:
TEXT: System.out.println("foo");
TEXT:
TEXT: blablablab
正如您所看到的,我必须在三个正则表达式中指定,行不能以字母或
#
开头,否则某些作为标题的行会被检测为缩进

如下使用awk可以得到所有缩进线

awk'/^(\t |\s)+/'$mdFile
但是awk只在文件中工作,我需要知道每个集团的位置

如何解析文件并获取缩进的所有行?正如我所解释的,我正在尝试使用regex,但是任何获得缩进行及其在文件中各自位置的解决方案都将非常好


您可以找到我编写的代码和所有正则表达式查看每行包含的内容:

$ cat infile
line
    indented
line
$ while read line; do echo "<$line>"; done < infile
<line>
<indented>
<line>

查看每一行的
内容

$ cat infile
line
    indented
line
$ while read line; do echo "<$line>"; done < infile
<line>
<indented>
<line>

你链接的代码有更多的问题:here doc没有引号,这将扩展其中的所有变量(可能是空字符串)。问题顶部的示例给出的预期输出是什么?你链接的代码有更多的问题:here doc没有引号,这将扩展其中的所有变量(可能是空字符串)。问题顶部的示例给出的预期输出是什么?谢谢,结果更好,但仍然没有找到所有行(使用
[^a-zA-Z#]+[:blank:]
)@oleecsoubet我不明白您是如何使用该正则表达式的(以及为什么),您是否使用它而不是
$regex
?我使用正则表达式来获取行是否缩进。请看我写的,我已经添加了你solution@OLeeCsobert我有回复,看看<代码>^[:blank:]+有效。谢谢!!!因此,技巧是使用
而IFS=read-r line
并引用解析的文件名。虽然结果更好,但仍然没有找到所有行(使用
[^a-zA-Z#]+[:blank:]
)@oleecsoubet我不明白你是如何使用该正则表达式的(以及为什么),您是否使用它而不是
$regex
?我使用正则表达式来获取行是否缩进。请看我写的,我已经添加了你solution@OLeeCsobert我有回复,看看<代码>^[:blank:]+有效。谢谢!!!因此,技巧是在IFS=read-r行时使用
,并引用解析文件的名称