源文件里面有很多段落,每个段落之间都是以‘##**************##’隔开。
需要把每个段落分割成一个单独的文件。
遇到的问题是文件中的‘ *’会被替换成文件名(单独的星号不会替换,星号空格也不会替换,只有空格星号的时候才会被替换),请大神指点。
源文件:
[root@local]# cat test.logs
4567890 *
##*************************************##
rtyuio**tyuio432
##*************************************##
*rtyuiop*2* yuiop
##*************************************##
rtyuiop(3 * 4)iuytr
##*************************************##
8765432
[root@local]#
脚本:
[root@local]# cat read.sh
#!/bin/sh
logsname=test.logs
i=100
while read line
do
if [[ $line =~ '##' ]];then
((i++))
else
echo $line >> $i.txt
fi
done < "${logsname}"
[root@local]#
输出:
[root@local]# ll
total 28
-rw-r--r--. 1 root root 25 Mar 10 19:13 100.txt
-rw-r--r--. 1 root root 17 Mar 10 19:13 101.txt
-rw-r--r--. 1 root root 18 Mar 10 19:13 102.txt
-rw-r--r--. 1 root root 59 Mar 10 19:13 103.txt
-rw-r--r--. 1 root root 8 Mar 10 19:13 104.txt
-rwxr-xr-x. 1 root root 204 Mar 10 19:10 read.sh
-rw-r--r--. 1 root root 241 Mar 10 19:13 test.logs
[root@local]# cat *.txt
4567890 sample test.logs
rtyuio**tyuio432
*rtyuiop*2* yuiop
rtyuiop(3 100.txt 101.txt 102.txt sample test.logs 4)iuytr
8765432
[root@local]#
给变量加上引用. 不然替换结果会再次进行展开
可以在脚本里加上
set -x
set -v
来看到底执行了什么
@jakio6:
修改了脚本如下,还是一样的问题。
do
set -x
set -v
if [[ "$line" =~ '##' ]];then
运行结果:
+ set -v
+ [[ 4567890 * =~ ## ]]
+ echo 4567890 100.txt 101.txt 102.txt 103.txt 104.txt sample test.logs
+ read line
+ set -x
+ set -v
+ [[ ##*************************************## =~ ## ]]
+ (( i++ ))
+ read line
+ set -x
+ set -v
+ [[ rtyuio**tyuio432 =~ ## ]]
+ echo 'rtyuio**tyuio432'
+ read line
+ set -x
+ set -v
+ [[ ##*************************************## =~ ## ]]
+ (( i++ ))
+ read line
+ set -x
+ set -v
+ [[ *rtyuiop*2* yuiop =~ ## ]]
+ echo '*rtyuiop*2*' yuiop
+ read line
+ set -x
+ set -v
+ [[ ##*************************************## =~ ## ]]
+ (( i++ ))
+ read line
+ set -x
+ set -v
+ [[ rtyuiop(3 * 4)iuytr =~ ## ]]
+ echo 'rtyuiop(3' 100.txt 101.txt 102.txt 103.txt 104.txt sample test.logs '4)i uytr'
+ read line
+ set -x
+ set -v
+ [[ ##*************************************## =~ ## ]]
+ (( i++ ))
+ read line
+ set -x
+ set -v
+ [[ 8765432 =~ ## ]]
+ echo 8765432
+ read line
@Robin_Wang: echo 那里
#!/bin/sh
set -v
set -x
logsname=test.logs
i=100
while read line
do
if [[ $line =~ '##' ]];then
((i++))
else
echo "$line" >> $i.txt
fi
done < "${logsname}"
@jakio6:
谢谢!!