我在文件中有令牌
[test][test2][test3]
有时,如果令牌被打破
[test][test2][test3]ad[te[[[]]]][]]]
只读取最里面的有效令牌,任何未关闭的令牌都被视为注释并被跳过。
所以出于上述
[test]
[test2]
[test3]
是有效令牌 除了剩下的,只有2个其他有效令牌是空的。
现在......我想要做的是使用sed解析文件。我已经完成了90%的解析。但是,我遇到了破损的令牌问题。
如果你好奇整个过程目前是如何工作的,那么这是我的批处理脚本:
echo off
REM s/\][^]]*/&\n/g doesn't work right
REM to remove [[ and ]] s/\][^]]*/&\n/g; s/\[[^[]*/&\n/g
REM to split up ][
for /f %%a in ('dir /b *.txt') do sed -e "s/\]\[/\]\n\[/g" %%~na.txt > %%~na.out
REM remove tabs, split up lines around [ and ]
for /f %%a in ('dir /b *.out') do sed -r "s/\t//g;s/([^]].+)\[/\1\n[/g;s/\]([^[].+)$/]\n\1/g" %%~na.out > %%~na.out2
REM remove all blanklines
for /f %%a in ('dir /b *.out2') do sed -e "s/^ *//; s/ *$//; /^$/d; s/\r//; /^\s*$/d" %%~na.out2 > %%~na.out3
REM cleanup
REM erase *.txt
REM ren *.out3 *.txt
REM erase *.out
echo on
我目前正在尝试解决的具体问题:
我如何分手 [somedata]]]]sometext
(无论我有多少人)。
成
[somedata]
]
]
]
sometext
和[[[[[somedata]
(注意括号的#不重要)
[
[
[
[
[somedata]
这是我使用
的真实样本数据item_gloves
[OBJECT:ITEM]
###test###
[ITEM_GLOVES:ITEM_GLOVES_GAUNTLETS]###test###
[NAME:gauntlet:gauntlets]
###test###[ARMORLEVEL:2][[[]][
[UPSTEP:1][[
###test###[SHAPED]
]][LAYER:ARMOR]###test######test###
[COVERAGE:100]
]][LAYER_SIZE:20]][
[LAYER_PERMIT:15]
[MATERIAL_SIZE:2]
[SCALED]
[BARRED]
[METAL]
[LEATHER]
[HARD]
答案 0 :(得分:0)
我会使用grep
扩展正则表达式(-E
):
grep -oE '\[[^][]+\]' <<< "[test][test2][test3]ad[te[[[]]]][]]]"
输出:
[test]
[test2]
[test3]
答案 1 :(得分:0)
您可以在每个左方括号前面和每个右方括号后添加一个换行符,使用这个微小的 sed 脚本:
sed 's/\[/\n[/g;s/\]/]\n/g' your_input_file
如果你想从上面的脚本中删除将要创建的空行,只需链接另一个 sed 命令来删除空行:
sed 's/\[/\n[/g;s/\]/]\n/g' your_input_file | sed '/^$/d'
上面在[test][test2][test3]ad[te[[[]]]][]]]
上生成的输出如下:
[test]
[test2]
[test3]
ad
[te
[
[
[]
]
]
]
[]
]
]
所以我不确定我是否理解你的问题,但如果你只想保持均衡的代币,你可以进一步 sed :
sed 's/\[/\n[/g;s/\]/]\n/g' your_input_file | sed '/^\[.*\]$/!d'
然后输出结束:
[test]
[test2]
[test3]
[]
[]
好的,但是如果这是你想要的,并且如果确保没有这样的标记越过换行边界,那么你可以使用grep -o
找到一个非常简单的解决方案,捕获由开放广场构成的所有标记括号后跟任意数量的非括号字符,然后是一个右方括号:
grep -o '\[[^][]*\]' your_input_file
输出:
[test]
[test2]
[test3]
[]
[]