sed正则表达式模式的一些棘手的线(ini部分)

时间:2012-08-31 00:45:47

标签: regex sed pattern-matching sh

我希望解析类似* .ini文件中的节条目:

line='      [          fdfd fdf         f   ]  '

该行拆分

的sed模式(???)是什么?
'fdfd fdf         f'

出?

所以:

echo "${line}" | sed -E 's/???/\1/g'

如何描述除[[:space:]][]以外的所有字符?这对我不起作用:[^[[:space:]]\[]*

3 个答案:

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