0

我正在尝试编写一个非常简单的 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
4

5 回答 5

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
于 2012-11-20T20:22:13.723 回答
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省略了系统上的最后一个换行符。

于 2012-11-20T20:51:25.287 回答
1
while read line; do
    (( ${#line} == 170 )) && c="" || c=$'\n'
    printf "%s%s" "$line" "$c"
done < testfile.log
于 2012-11-20T23:23:43.087 回答
0

一点awk可能会有所帮助:

awk '{if (length($0) == 170) printf "%s",$0; else print $0}' < file
于 2012-11-20T20:44:55.480 回答
0

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

$ perl -ne 'chomp; length($_) == 170 ? print : print $_, $/' file.txt
于 2012-11-20T20:47:25.653 回答