sed不能使用条件if语句bash脚本

时间:2014-09-29 05:48:53

标签: bash sed conditional

我是bash脚本的初学者,我想问一些事情。

我的条件语句将计算机中的时间与字符串中的时间进行比较,如下所示:

 #!/bin/bash

 skrg=$(date +%H%M%S)

 while IFS=':' read LINE do

         tanggal=${LINE//[:]/}
         if test $skrg -ge $tanggal 
         then
                 echo string
                 sed -e 's/$/LINE/' -i soal
         fi
 done < soal

echo命令在if语句下工作,但sed没有,它仍然添加LINE字符串,即使if语句错误。

我对这个问题非常困惑,谢谢你的帮助:D


示例输入:

  

01:12:14

     

7时08分45秒

     

22时10分45秒

输出: 它应该像这样=

  

01:12:14 LINE

     

07:08:45 LINE

     

22时10分45秒

但输出是=

  

01:12:14 LINE

     

07:08:45 LINE

     

22:10:45 LINE

3 个答案:

答案 0 :(得分:2)

问题是,

sed -e 's/$/LINE/' -i soal

因为,sed将在所有行中应用s/$/LINE/替换。这就是为什么,你没有得到预期的产出。

要调试:

cat soal循环结束时添加while。像这样,

 #!/bin/bash

 skrg=$(date +%H%M%S)

 while IFS=':' read LINE do

         tanggal=${LINE//[:]/}
         if test $skrg -ge $tanggal 
         then
                 sed -e 's/$/LINE/' -i soal
         fi
         cat soal
 done < soal

<强>解决方案:

您需要在进行替换时使用行号。

#!/bin/bash

skrg=$(date +%H%M%S)
line=1

while IFS=':' read LINE
do
        tanggal=${LINE//[:]/}
        if test $skrg -ge $tanggal
        then
                sed -i "$line{s/$/LINE/}" soal
        fi
        line=$((line+1))
done < soal

答案 1 :(得分:1)

你的输出搞砸了,因为你一直在覆盖输入文件!

sed -e 's/$/LINE/' -i soal

这实际上会覆盖soal

答案 2 :(得分:1)

主要保留您的代码

#!/bin/bash

skrg=$(date +%H%M%S)

while IFS=':' read LINE do

         tanggal=${LINE//[:]/}
         if test $skrg -ge $tanggal 
         then
                 echo string
                 echo "${LINE} LINE" >> /tmp/soal.tmp
         else
                 echo "${LINE}" >> /tmp/soal.tmp

         fi
 done < soal

mv /tmp/soal.tmp soal