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模式匹配”,但没有成功。有什么帮助吗?
在纯 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)