3

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

4 回答 4

4

尝试遵循正则表达式。它使用字符类而不是文字空间,并\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 {
于 2013-07-09T20:50:34.417 回答
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 _____________
}
于 2013-07-09T21:20:23.290 回答
3

特殊的正​​则表达式字符必须不加引号(手册说“可以引用模式的任何部分以强制将其作为字符串匹配。”。

此外, bash 正则表达式不理解 perl \w

这有效:

[[ $line =~ "class "[[:alnum:]_]+ ]]
于 2013-07-09T20:51:10.400 回答
2

为什么不使用grep

kent$  grep -E '^class\s+\w+.*{' test 
class c1 {
class c2 {
class c3 {
于 2013-07-09T20:45:08.433 回答