我想解析 *.ini 文件中的部分条目之类的内容:
line=' [ fdfd fdf f ] '
这条线拆分的 sed 模式(???)可能是什么
'fdfd fdf f'
出去?
所以:
echo "${line}" | sed -E 's/???/\1/g'
我如何描述除和[[:space:]]之外的所有字符?这对我不起作用:。[][^[[:space:]]\[]*
我想解析 *.ini 文件中的部分条目之类的内容:
line=' [ fdfd fdf f ] '
这条线拆分的 sed 模式(???)可能是什么
'fdfd fdf f'
出去?
所以:
echo "${line}" | sed -E 's/???/\1/g'
我如何描述除和[[:space:]]之外的所有字符?这对我不起作用:。[][^[[:space:]]\[]*
当您使用[[: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:][]
第一个括号和最后一个括号是一对匹配的,即使您认为它们看起来不应该是这样。
$ echo "$line" | sed "s/^.*\[[[:space:]]*\([^]]*[^][:space:]]\)[[:space:]]*\].*$/'\1'/"
您可以将模式一分为二:
$ echo "$line" | sed "s/^.*\[[[:space:]]*/'/; s/[[:space:]]*\].*$/'/"
awk也可以:
$ echo "$line" | awk -F' *[[\]] *' -vQ="'" '{print Q$2Q}'
当您说拆分时,您的意思是拆分为数组,还是过滤掉所有空格和括号?
假设 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
如果这些都不是您的意思,请指定您希望从初始值中提取的确切输出,以便我们能够正确解决它。