使用bash脚本中的sed从文件中删除一行

时间:2012-12-17 15:23:17

标签: bash shell sed

我目前正在开发一个shell脚本,其中有时可能会将错误输出到文件但我需要移动错误,因为它并不意味着什么,只要错误不存在,一切正常。

我有一个脚本,其中包含以下内容:

ftp ftp://$2:$3@$1 << BLOCK > $5
cd "$4"
ls
quit
BLOCK

$ 5是写入FTP命令输出的文件。所以在文件中我有以下

total 8
-rw-r--r--  1 root  root  42 Dec 17 14:26 test1.txt
-rw-r--r--  1 root  root   6 Dec 17 14:08 test2.txt

有时我收到错误?Invalid command.,因此我使用sed从文件中删除错误。我已将shell脚本更改为以下内容。测试注意事项我已将error放在FTP中以确保我收到上述错误消息。

ftp ftp://$2:$3@$1 << BLOCK > $5
cd "$4"
ls
error
quit
BLOCK
fileout=$(sed '/?Invalid command./d' $5)
echo $fileout > $5

这是因为我正在删除错误消息,但它也删除了换行符,所以当我查看文件时,我得到以下内容

total 8 -rw-r--r-- 1 root root 42 Dec 17 14:26 test1.txt -rw-r--r-- 1 root root 6 Dec 17 14:08 test2.txt

如何保留换行符?

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:3)

您需要在fileout echo时引用echo "$fileout" > $5,以保留换行符。

但是,您应该使用sed来编辑文件&#34;就地&#34;而不是这样做。然后,您不必将sed的输出保存到变量中,然后echo将其再次退出,这会导致问题。

使用:

sed -i '/?Invalid command./d' $5

而不是:

fileout=$(sed '/?Invalid command./d' $5)
echo $fileout > $5

答案 1 :(得分:0)

只是做:

ftp ftp://$2:$3@$1 << BLOCK | sed ... > $5
...
BLOCK

或者,如果您愿意:

ftp ftp://$2:$3@$1 << BLOCK | 
...
BLOCK
sed ... > $5