我有档案test.txt
class c1 {
___________ any text _____________
}
class c2 {
___________ any text _____________
}
class c3 {
___________ any text _____________
}
我编写bash脚本逐行扫描test.txt
并将每一行与正则表达式进行比较,以获得包含类标题但不起作用的行:(
#!/bin/bash
while read line
do
if [[ "$line" =~ "class *\w+" ]]; then
echo $line
fi
done <test.txt
最终目标将文件中的每个类分开
答案 0 :(得分:4)
试试以下正则表达式。它使用字符clases而不是文字空格\w
来避免使用双引号:
if [[ "$line" =~ class[[:blank:]][[:alnum:]]+ ]]; then
...
fi
编辑:要将每个类写入不同的文件,请对类名进行分组并重定向到它:
#!/usr/bin/env bash
while read line
do
if [[ "$line" =~ class[[:blank:]]([[:alnum:]]+) ]]; then
echo "$line" >> ${BASH_REMATCH[1]}.txt
fi
done <test.txt
要检查结果,请运行:
head c[123].txt
产量:
==> c1.txt <==
class c1 {
==> c2.txt <==
class c2 {
==> c3.txt <==
class c3 {
答案 1 :(得分:4)
使用awk
awk '/^class/{p=1;++x}/^}/{p=0;print $0>"file"x}p{print $0>"file"x}' test.txt
<强>输出强>
$ head file*
==> file1 <==
class c1 {
___________ any text _____________
}
==> file2 <==
class c2 {
___________ any text _____________
}
==> file3 <==
class c3 {
___________ any text _____________
}
答案 2 :(得分:3)
特殊的正则表达式字符必须不带引号(手册中说“可以引用模式的任何部分以强制它匹配为字符串。”。
另外,bash正则表达式不理解perl \w
。
这有效:
[[ $line =~ "class "[[:alnum:]_]+ ]]
答案 3 :(得分:2)
为什么不使用grep
?
kent$ grep -E '^class\s+\w+.*{' test
class c1 {
class c2 {
class c3 {