BASH-如何从#SOF到#EOF从文件中检索行
如何从#SOF到#EOF从文件中检索行 我需要3个文件BASH-如何从#SOF到#EOF从文件中检索行,bash,awk,Bash,Awk,如何从#SOF到#EOF从文件中检索行 我需要3个文件 in target_1.sh "Lorem ipsum dolor sit amet" "Vivamus pretium enim" "Est accumsan enim magnis" in target_2.sh "Eleifend tincidunt id justo" "Tellus ut tincidunt vel ac a orci" "Sapien Nullam Sed nunc" "Vestibulum est accum
in target_1.sh
"Lorem ipsum dolor sit amet"
"Vivamus pretium enim"
"Est accumsan enim magnis"
in target_2.sh
"Eleifend tincidunt id justo"
"Tellus ut tincidunt vel ac a orci"
"Sapien Nullam Sed nunc"
"Vestibulum est accumsan enim"
in target_3.sh
"Consequat mauris mollis montes"
告诉某人怎么做?感谢您的帮助您可以通过以下方式完成:
输入/输出:
- 匹配问题中显示的示例
:调用awk,一种逐行操作文本文件的工具。单引号集所包含的说明将提供给awkawk'…'
:/^#EOF$/{do_print=0}
是“行开始”的正则表达式锚,而^
是“行结束”的锚。这里我们要说的是,如果我们将$
视为行上的唯一内容,请关闭打印标志#EOF
do#u print
:这将对awk解析的每一行运行。如果设置了do_uprint{print>(“target_u“f_index.sh”)}
标志,则使用do_print
指定的索引将该行附加到输出文件中f_index
:同样,如果我们在一行上只看到/^ SOF$/{do_print=1;f_index++}
,请打开打印标志,并将#SOF
增加1f_index
- 请注意,每行都会计算最后3项,这就是为什么我们首先查找EOF,然后打印行(如果适用),然后再查找SOF-我们不想打印
或#EOF
#SOF
:指定要source.sh
的输入文件的名称;救一只猫awk
- 将优雅地完成:
awk '
/^#EOF/{l=0}
l {
print > "target_" file ".sh"
}
/^#SOF/{l=1;file++}
' source.sh
处理后
$ ls -1t target_*
target_1.sh
target_2.sh
targer_3.sh
解释
与l{}
相同,因为if(l==1){}
是1
awk
#!/bin/bash
c=0
while read a; do
if [[ $a =~ ^#SOF ]]; then
l=1
((file++))
fi
[[ $a =~ ^#EOF ]] && l=0
if [[ ! $a =~ ^#SOF ]] && ((l==1)); then
echo $a >> "target_${file}.sh"
fi
done < input_file
#/bin/bash
c=0
边读边读;做
如果[$a=~^#SOF]];然后
l=1
((文件++))
fi
[$a=~^#EOF]&&l=0
如果[!$a=~^#SOF]&&((l==1));然后
echo$a>>“target_${file}.sh”
fi
完成
您不需要&&/^#SOF/
如果你把/^#SOF/
放在打印块后面,那就把它分出来。我已经对这个答案投了赞成票。我更喜欢编辑过的版本。@glennjackman你们这些家伙教了我很多新东西;我慢慢地一点一点地把它们捡起来;)
$ ls -1t target_*
target_1.sh
target_2.sh
targer_3.sh
#!/bin/bash
c=0
while read a; do
if [[ $a =~ ^#SOF ]]; then
l=1
((file++))
fi
[[ $a =~ ^#EOF ]] && l=0
if [[ ! $a =~ ^#SOF ]] && ((l==1)); then
echo $a >> "target_${file}.sh"
fi
done < input_file