我希望解析类似* .ini文件中的节条目:
line=' [ fdfd fdf f ] '
该行拆分
的sed模式(???)是什么?'fdfd fdf f'
出?
所以:
echo "${line}" | sed -E 's/???/\1/g'
如何描述除[[:space:]]
,[
和]
以外的所有字符?这对我不起作用:[^[[:space:]]\[]*
。
答案 0 :(得分:3)
当您使用[[:space:]]
语法时,外括号是正常的“匹配此列表中的一个字符”括号,与[aeiou]
中的相同,但内括号是[:space:]
的一部分这是一个不可分割的单位。
因此,如果您想匹配属于space
类或x
的单个字符,您可以使用[[:space:]x]
或[x[:space:]]
如果您要匹配的其中一个字符是]
,它将终止括号中的字符列表,除非您给它一些特殊处理。你猜对了某个地方需要反斜杠;一个好的猜测,但错了。在列表中包含]
的方法是将其放在第一位。 [ab]c]
是一个括号内的列表,其中包含2个字符ab
,后跟2个文字匹配字符c]
,因此它与"ac]"
或"bc]"
匹配,但{{1} }是4个字符[]abc]
的括号中的列表,因此它与]abc
,"a"
,"b"
或"c"
匹配。
在否定列表中,"]"
紧跟在]
之后。
所以把所有这些放在一起,匹配除^
类和括号之外的所有字符集中的单个字符的方式是:
[:space:]
第一个括号和最后一个括号是匹配对,即使您认为它们看起来不应该是这样。
答案 1 :(得分:0)
$ echo "$line" | sed "s/^.*\[[[:space:]]*\([^]]*[^][:space:]]\)[[:space:]]*\].*$/'\1'/"
您可以将模式拆分为两个:
$ echo "$line" | sed "s/^.*\[[[:space:]]*/'/; s/[[:space:]]*\].*$/'/"
awk
也有效:
$ echo "$line" | awk -F' *[[\]] *' -vQ="'" '{print Q$2Q}'
答案 2 :(得分:0)
当你说拆分时,你的意思是拆分为数组,还是指过滤所有的空格和括号?
假设file.ini中第1行的值为:
[ fdfd fdf f ]
如果你的意思是数组,
$linenumber=1;
array=($(sed -n ${linenumber}p file.ini | sed 's/[][]*//g'));
将file.ini的第1行拆分为数组并返回值:
${array[0]} = fdfd
${array[1]} = fdf
${array[2]} = f
如果您的意思是过滤空格和括号,
$linenumber=1;
sed -n ${linenumber}p file.ini | sed 's/[ []]*//g';
将返回:
fdfdfdff
如果这些都不是您的意思,请指定您要从初始值中提取的确切输出,以便我们能够正确解决。< / p>