我正在尝试编写一个非常简单的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
答案 0 :(得分:1)
您的代码存在很多问题,从哪里开始?
bash
和ksh
中的语法为:
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