在Bash脚本中使用sed删除文件中的一行

3

我目前正在编写一个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脚本更改为以下内容。请注意,为了测试,我在FTP中放置了error,以确保我能够收到上述错误消息。
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个回答

3

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

但是,你应该直接使用 sed 在文件中进行编辑,这样就不需要将 sed 的输出保存到变量中,然后再使用 echo 输出,从而避免了这个问题。

使用:

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

替代:

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

1
引用 sed 的输出绝对荒谬。这正是管道的用途。 - William Pursell

0

只需这样做:

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

或者,如果你更喜欢:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接