如何使用 sed 跳过空文件?

如何使用 sed 跳过空文件?

我正在sed这样使用:

 sed -e 's/ *| */|/g'
   ${array_export_files[$loopcount]}>>$TEMPDIR/"export_file"_${testid}_${loopcount}_$$

在 while 循环下,但当文件为空或不包含任何内容时就会出现问题。

  1. sed如果文件存在但是为空,我不希望运行;
  2. sed如果文件不存在,我不想运行。

完整的代码片段是

while [ $loopcount -le $loopmax ]
do 
    if [ "$loopcount" -eq "$loopcount" ]
    then
        sed -e 's/ *| */|/g' ${array_export_files[$loopcount]}>>$TEMPDIR/"export_file"_${testid}_${loopcount}_$$
        tr "|" "\t" <"export_file"_${testid}_${loopcount}_$$>${array_export_files[$loopcount]}
        cp ${array_export_files[$loopcount]} "export_file"_${loopcount}_${testid}
        echo "Testing Starts Here"
        echo ${array_export_files[$loopcount]} "export_file"_${loopcount}_${testid}
        echo "Testing Ends Here"
    fi
  (( loopcount=`expr $loopcount+1`))
done    

所以我无法在上面的 if 语句中替换或使用 AND 运算符,是否有解决这个问题的方法?如果我使用 AND 运算符,那么它可能会跳过下面的整个代码部分,也不会运行我只想有条件地跳过 sed 部分。

答案1

Bash 可以-s选择测试是否存在大小大于零:

 -s file
          True if file exists and has a size greater than zero.

所以你可以做

if [ -s "${array_export_files[$loopcount]}" ]; then
   sed .......
fi

循环内。由于if [ "$loopcount" -eq "$loopcount" ]始终为真,因此您可以将其替换为:

while [ "$loopcount" -le "$loopmax" ]
do 
    if [ -s "${array_export_files[$loopcount]}" ]
    then
        sed -e 's/ *| */|/g' "${array_export_files[$loopcount]}" >>" $TEMPDIR/export_file_${testid}_${loopcount}_$$"
        tr "|" "\t" <"export_file_${testid}_${loopcount}_$$">"${array_export_files[$loopcount]}"
        cp "${array_export_files[$loopcount]}" "export_file_${loopcount}_${testid}"
        echo "Testing Starts Here"
        echo "${array_export_files[$loopcount]}" "export_file_${loopcount}_${testid}"
        echo "Testing Ends Here"
    fi
    (( loopcount = loopcount + 1 ))
done

相关内容