使用 bash,根据模式匹配创建文件

tea*_*m 9 2 command-line text-processing

我们有一个内容如下的文件。

/* ----------------- pattern_1 ----------------- */ 

jb: pattern_1   Data: asdflj  adfas Log: dir/log1

/* ----------------- pattern_2 ----------------- */ 

jb: pattern_2   typ: CM comm: ${dir}/DISPV mach: au_buh description: "run flag"


/* ----------------- pattern_3 ----------------- */ 

jb: pattern_3   typ: fw  own: buh out_file: "${log}/jl.log" err: "log.err"
Run Code Online (Sandbox Code Playgroud)

该文件必须分为 3 个并创建为 3 个单独的文件,如下所示:

模式_1.txt

/* ----------------- pattern_1 ----------------- */ 

jb: pattern_1   Data: asdflj  adfas Log: dir/log1
Run Code Online (Sandbox Code Playgroud)

模式_2.txt

* ----------------- pattern_2 ----------------- */ 

jb: pattern_2   typ: CM comm: ${dir}/DISPV mach: au_buh description: "run flag"
Run Code Online (Sandbox Code Playgroud)

模式_3.txt

/* ----------------- pattern_3 ----------------- */ 

jb: pattern_3   typ: fw  own: buh out_file: "${log}/jl.log" err: "log.err"
Run Code Online (Sandbox Code Playgroud)

尝试过“awk模式匹配”,但没有成功。有什么帮助吗?

Raf*_*ffa 5

在纯 Bash 中:

while IFS= read -r line; do
  [[ "$line" =~ /\*.*(pattern_[0-9]+).*\*/ ]] && f="${BASH_REMATCH[1]}"
  [[ "$line" =~ ^$ ]] || echo "$line" >> "${f}.txt"
  done < file
Run Code Online (Sandbox Code Playgroud)

...如果您希望新文件中包含原始空白行,请删除[[ "$line" =~ ^$ ]] ||.

请注意,如果以模式名称命名的文件(即pattern_N.txt预先存在于当前工作目录中),那么它们的输出将被附加到其中,这可能不是您想要的,因此在运行上述循环之前首先清除这些文件(如果存在)。

使用 AWK(首选 GNU AWK):

awk '
/\/\*.*pattern_[0-9]+.*\*\// {
    r = $0
    gsub("[^pattern_0-9]*", "", r)
    out=r".txt"
    print > out
}

! /\/\*.*pattern_[0-9]+.*\*\/|^$/ {
    print > out
}
' file
Run Code Online (Sandbox Code Playgroud)

...如果您希望新文件中包含原始空白行,请删除|^$.

示范:

awk '
/\/\*.*pattern_[0-9]+.*\*\// {
    r = $0
    gsub("[^pattern_0-9]*", "", r)
    out=r".txt"
    print > out
}

! /\/\*.*pattern_[0-9]+.*\*\/|^$/ {
    print > out
}
' file
Run Code Online (Sandbox Code Playgroud)