如何在两个相同匹配的char(特定模式)之间插入一个新行?

时间:2014-08-18 21:43:27

标签: regex variables sed

我在文件中有令牌

[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]

2 个答案:

答案 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]
[]
[]