我想解析 *.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
如果这些都不是您的意思,请指定您希望从初始值中提取的确切输出,以便我们能够正确解决它。