逐行读取文件,如果行长度= 170,则删除结束行字符

时间:2012-11-20 20:12:58

标签: bash shell unix ksh

我正在尝试编写一个非常简单的shell脚本,它将逐行解析一个文件,如果它发现该行的长度是170个字符,那么我希望它删除而不是行尾字符所以它会合并下一行与它。

我写了剧本,但它不起作用,我知道我错过了一些东西,因为我一直收到这个错误:

-bash-3.2$ ./removeline.sh
'/removeline.sh: line 2: syntax error near unexpected token `do
'/removeline.sh: line 2: `do

这是我的剧本:

for line in `testfile.log`
do
echo ${#line} > $i
if $i = 170 ; then
tr -d '\n'
end
done

5 个答案:

答案 0 :(得分:1)

您的代码存在很多问题,从哪里开始?
bashksh中的语法为:

while read line
do
    i=${#line}
    if (( $i == 170 ))
    then
        tr -d '\n'
    fi
done < testfile.log

(我没有检查tr命令) 但是,我仍然认为这不会达到你的目的。

这可能更接近标记:

while read line
do
    i=${#line}
    if (( $i == 170 ))
    then
        echo -n "$line"
    else
        echo "$line"
    fi
done < testfile.log > testfile.new

答案 1 :(得分:1)

tr是错误的工具,因为它不会操纵您已读过的行。好吧,你可以echo "$line" | tr -d '\n'但是试试这个:

while read line; do
  n=""
  case $#line in 170 ) n="-n" ;; esac
  echo $n "$line"
done <testfile.log

...假设echo -n省略了系统的最终换行符。

答案 2 :(得分:1)

while read line; do
    (( ${#line} == 170 )) && c="" || c=$'\n'
    printf "%s%s" "$line" "$c"
done < testfile.log

答案 3 :(得分:0)

一点awk可能会有所帮助:

awk '{if (length($0) == 170) printf "%s",$0; else print $0}' < file

答案 4 :(得分:0)

使用perl(便携式和适当的解决方案)

$ perl -ne 'chomp; length($_) == 170 ? print : print $_, $/' file.txt