我有一个看起来像
的字符串 arg1 {0 1} arg2 {5 87} string {with space} ar3 1
它按空格分割,但字符串也可能包含空格,因此会导致带空格的字符串出现问题。我仍然需要拆分这个字符串,但是我不想拆分包含在curl括号中的字符串,并以string
关键字作为前缀。这意味着上面的字符串应该像那样分割
arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1
无法实现这一点,我真的需要阅读很多关于正则表达式的内容。你能帮我吗?
答案 0 :(得分:2)
第1步:像往常一样用空格分割,得到一个数组
第2步:遍历数组,如果找到{[a-zA-Z]+
,则用空格连接下一个元素,然后删除下一个元素。
echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1"|awk '{split($0,a);
for(i=1;i<=length(a);i++){
if(a[i]~/{[a-zA-Z]+/){a[i]=a[i]" "a[i+1];delete a[i+1];}
if(a[i])print a[i];} }'
arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1
<强> ==更新== 强>
好的,根据您的评论,这也有效:
步骤1,找出那些你不想“拆分”的字符串,用一个特殊字符串替换。而重要的是将找到的字符串保存到另一个数组grep示例中的模式:
echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|grep -E -o '\{([a-zA-Z]+\s*)*\}'
{with space}
{abc def}
{xyz zyx}
after replace:xxxxxxxxx as the special string
kent$ echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|sed -r 's#\{([a-zA-Z]+\s*)*\}#xxxxxxxxx#g'
arg1 {0 1} arg2 {5 87} string xxxxxxxxx ar3 1 xxxxxxxxx xxxxxxxxx
step2,做拆分
步骤3,用右索引替换特殊字符串。
答案 1 :(得分:0)
我不知道QRegExp,所以我不知道它是否具有lookaround功能。如果确实如此,你可以尝试拆分这样的东西:
(?<!(^|})[^{]*\bstring\s{[^}]*)\s
除了紧跟在单词string
之前的一对大括号内的那些空格字符之外,它应该分开。如果string
关键字已经在一组大括号内,它将忽略它。
您还可以使用简化版(?<!\bstring\s{[^}]*)\s
,但这会受到foo {string {bar qux}}
等奇怪内容的影响。