在bash中分析一个markdown文件,以获取所有缩进的行及其在文件中的位置



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

下面是一个markdown文件的例子,我想为它获取所有缩进的行。

# 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

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

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

我的代码是:

# One of the regex I have tested
regex='^[[:blank:]]+'  #Not find any line
while read line; do
# Try to find indented lines by using regex
if [[ $line =~ $regex ]]; then
echo "INDENTED: $line"
else
echo "TEXT: $line"
fi
done < $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,但任何获得缩进行及其在文件中各自位置的解决方案都将非常好。

你可以在这里找到我写的代码和所有正则表达式

看看line每行包含什么:

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

这是因为read(强调矿(的这种行为:

从标准输入中读取一行[…],如上文"分词"中所述,拆分为单词,第一个单词分配给第一个名称,[…]

要防止这种情况,请将IFS设置为空字符串(并添加-r以避免反斜杠解释(:

$ while IFS= read -r line; do echo "<$line>"; done < infile
<line>
<    indented>
<line>

相关内容

  • 没有找到相关文章

最新更新