如何快速删除尾随的CR?

如何快速删除尾随的CR?

这是我的源文件,它将数据库转储为 JSON,并且与 Debian wheezy 配合得很好:

#!/bin/sh

echo "Status: 200"
echo

echo {

printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2

do
if [ "$col2" = "true" -o "$col2" = "false" ]
then
  echo "\"$col1\" : $col2,"
else
  case $col2 in
    *['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
  esac
  echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }

我需要为 Debian Stretch 更新它,但我收到了不需要的回车符。没问题,我修复了它,并且在这个版本中我得到了正确的输出:

#!/bin/sh

echo "Status: 200"
echo

echo {

printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2

do
col2=`echo "$col2" | sed 's/.$//'`
if [ "$col2" = "true" -o "$col2" = "false" ]
then
  echo "\"$col1\" : $col2,"
else
  case $col2 in
    *['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
  esac
  echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }

问题是,正确的版本非常慢(数据库不大,但我的硬件有限)。第一个版本运行时间约为 300 毫秒,第二个版本运行时间为 6 秒。应该如何改变才能加快执行速度?

谢谢!

答案1

性能问题可能是由于您运行

col2=`echo "$col2" | sed 's/.$//'`

对于每一行。顺便说一句:这会删除每行的最后一个字符,即使它不是回车符。我建议使用sed 's/\r$//'

您可以对整个输出执行此操作

printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | sed 's/\r$//' | while IFS=, read col1 col2

如果您只是想删除所有字符'\r'并且不想保留这些可能出现在行中间的字符,您也可以使用tr -d '\r'代替sed 's/\r$//'

答案2

您的新版本正在sed每一行上调用。您可以通过tr在初始命令中仅调用一次来删除 CR 来避免:

printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | tr -d '\r' | while IFS=, read col1 col2

相关内容