testPage
我有一个名为以下文本的测试文件:
|| '''Title1''' || '''Title2''' || '''Title3''' ||
|| Cell11 || Cell12 || Cell13 ||
|| Cell21 || Cell22 ||
|| Cell31 || Cell32 ||
|| Cell41 || Cell42 ||
|| CEll51 || Cell52 ||
|| Cell61 || Cell62 ||
|| Cell71 || Cell72 ||
我想要的样子:
{|
|'''Title1''' || '''Title2''' || '''Title3''' ||
|-
| Cell11 || Cell12 || Cell13 ||
|-
| Cell21 || Cell22 ||
|-
| Cell31 || Cell32 ||
|-
| Cell41 || Cell42 ||
|-
| CEll51 || Cell52 ||
|-
| Cell61 || Cell62 ||
|-
| Cell71 || Cell72
|}
我有一个脚本:
#!/bin/bash
isTable=0
beginTable="^\|\|"
lineNum=1
while IFS= read -r line
do
echo "lineNum: $lineNum, line: $line, isTable: $isTable"
if [[ $line =~ $beginTable ]]
then
if [ "$isTable" -eq "0" ]
then
isTable=1
sed -r $lineNum's_\|\|_\{\|\n\|_' -i testPage #Begin table
echo "begin table"
else
sed -r $lineNum's_^\|\|_\|-\n\|_' -i testPage #Define row ##DOESN'T WORK##
echo "start of row"
fi
else
if [ "$isTable" -eq "1" ]
then
isTable=0
sed -r $lineNum's_(.*)$_\1\n\|\}\n_' -i testPage #End table ##WEIRD RESULT##
echo "end table"
fi
fi
((lineNum++))
done < testPage
结果如下:
{|
| '''Title1''' || '''Title2''' || '''Title3''' ||
|-
| Cell11 || Cell12 || Cell13 ||
|-
| Cell21 || Cell22 ||
|-
| Cell31 || Cell32 ||
|| Cell41 || Cell42 ||
|}
|| CEll51 || Cell52 ||
|| Cell61 || Cell62 ||
|| Cell71 || Cell72 ||
我无法弄清楚为什么它在三次迭代后停止替换,即使循环报告了适当的行和行号以及匹配了适当的逻辑。
任何帮助表示赞赏。
为了清楚起见, testPage 是较大文件的一部分,因此sed
开始和结束标志(即,在行1
和 上做不同的事情$
)对我来说不起作用。
答案1
sed 's/||$/&\n|-/;s/^||/|/;1s/^/{|\n/;$s/-$/}/' file
注意\n
仅适用于 GNU sed,因此应该是
sed 's/||$/||\
|-/;s/^||/|/;1s/^/{|\
/;$s/-$/}/' file
答案2
我使用了组合答案来达到我想要的结果。
#!/bin/bash
isTable=0
beginTable="^\|\|"
lineNum=1
tableCount=0
while IFS= read -r line #Print changes to temp file
do
if [[ $line =~ $beginTable ]]
then
if [ "$isTable" -eq "0" ]
then
isTable=1
((tableCount++))
> $1_$tableCount
sed -n -r $lineNum's_^\|\|_\{\|\n\|_p' $1 >> $1_$tableCount #Begin table
sed -r $lineNum's_^\|\|_@'$tableCount'@_' -i $1
else
sed -n -r $lineNum's_^\|\|_\|-\n\|_p' $1 >> $1_$tableCount #Define row
fi
else
if [ "$isTable" -eq "1" ]
then
isTable=0
sed -n -r $lineNum's_(.*)$_\1\|\}\n_p' $1 >> $1_$tableCount #End table
fi
fi
((lineNum++))
done < $1
for ((n=1;n<=$tableCount;n++))
do
sed -e '/@'$n'@/r '$1'_'$n'' -e '/^@'$n'@/d;/^||/d' -i $1
rm "$1"_"$n"
done
我将每个表打印到不同编号的文件中,然后sed
将每个表读入原始文件中。