【发布时间】:2017-07-27 12:10:37
【问题描述】:
我有一个文件,其中包含由 <BD> begin 和 <ED> end delimiters 分隔的文本,并且允许嵌套。我希望更改这些分隔符以唯一地指示它们之间的每个文本范围。这些分隔符可以是任意字符串。例如:
%{ # Begin delimiter <BD>
}% # End delimiter <ED>
我希望用唯一编号的标记替换分隔符:
<BM><UniqueNumber><BM> # <BD> is replaced by <BM>i<BM>
<EM><UniqueNumber><EM> # <ED> is replaced by <EM>i<EM>
<BM> 和 <EM> 是任意长度的字符串,可以是二进制的,并且不存在于正在处理的文件中。例如,在大多数文本文件中,可以将$'\x01' 用于<BM>,将$'\x02' 用于<EM>。
例如,文件包含分隔的文本范围,包括嵌套范围:
A %{ B
C %{ D
E }% F %{ G }% H }% I
J %{ K }% L
字母 A..L 可以是任何文本。转换产生:
A <BM>0<BM> B
C <BM>1<BM> D
E <EM>1<EM> F <BM>2<BM> G <EM>2<EM> H <EM>0<EM> I
J <BM>3<BM> K <EM>3<EM> L
注意:我不是在寻找表示嵌套级别的编号;我正在寻找每个匹配的 <BM>i<BM>...<EM>i<EM> 文本跨度以唯一整数标记,从 0 向上计数。
而且,我希望能够存储为标记 0..N-1 生成的最大数量 N。我在想象 Bash 函数:
ChangeMarkup()
{
local InputFile="$1"
local OutputFile="$2"
local BD="$3" # Begin delimiter
local ED="$4" # End delimiter
local BM="$5" # Begin unique numbered marker
local EM="$6" # End unique numbered marker
local -i N=0
# ... convert InputFile to OutputFile, incrementing N for each span
echo "$N" # Echo the number of spans
}
# Example invocation:
NSpans=$(ChangeMarkup infile outfile '%{' '}%' $'\x01' $'\x02')
我认为,解决方案是这样的:
- 初始化
N=0 - 扫描
<BD>并将N推入堆栈。将<BD>替换为<BM>$N<BM>。递增N。 - 扫描
<ED>并替换为<EM><pop stack><EM> - 最后,回显
$N
我在想 Bash 脚本中的一些 awk 可能会派上用场。我认为这超出了 sed 的能力。我也对 python 或任何可以用 Bash 脚本编写的解决方案持开放态度,仅限于使用 CentOS 7 Minimal iso 中可用的软件包。不幸的是,这意味着不能考虑 perl。
【问题讨论】:
-
H }% I而不是H %} I输入错误? -
@JoseRicardoBustosM。是的,这是一个错字……已修复!谢谢。
标签: python bash awk sed centos7