1

我想解析 *.ini 文件中的部分条目之类的内容:

line='      [          fdfd fdf         f   ]  '

这条线拆分的 sed 模式(???)可能是什么

'fdfd fdf         f'

出去?

所以:

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

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

4

3 回答 3

3

当您使用[[:space:]]语法时,外括号是普通的“匹配此列表中的一个字符”括号,与 in 相同,[aeiou]但内括号是其中的一部分[:space:],是不可分割的单元。

因此,如果您想匹配属于space该类或x您将使用的单个字符,[[:space:]x]或者[x[:space:]]

当您要匹配的字符之一是 a]时,它将终止括号中的字符列表,除非您对其进行特殊处理。您已经猜到在某处需要反斜杠;一个很好的猜测,但错误。将 a 包含]在列表中的方法是将其放在首位。[ab]c]是一个包含 2 个字符的括号列表ab,后跟 2 个文字匹配字符c],因此它匹配"ac]"or "bc]"but[]abc]是 4 个字符的括号列表,]abc因此它匹配"a""b""c""]"

在否定列表中,]紧跟在 . 之后^

[:space:]因此,将所有这些放在一起,从除类和括号之外的所有字符集中匹配单个字符的方法是:

[^][:space:][]

第一个括号和最后一个括号是一对匹配的,即使您认为它们看起来不应该是这样。

于 2012-08-31T01:11:32.053 回答
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}'
于 2012-08-31T01:08:47.577 回答
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

如果这些都不是您的意思,请指定您希望从初始值中提取的确切输出,以便我们能够正确解决它。

于 2012-08-31T01:34:48.550 回答