在if语句中将字符串与正则表达式进行比较

时间:2013-07-09 20:37:56

标签: bash

我有档案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

最终目标将文件中的每个类分开

4 个答案:

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