为什么我的第一个管道操作没有删除换行符?

为什么我的第一个管道操作没有删除换行符?

我的nextermCensus.lis包含换行符,我只对第一行感兴趣,我想删除换行符。但它不起作用。所以我必须使用第二种方法来删除它。 $(echo $census_day | tr -d '\n')按我的预期工作。但我真的很喜欢用一行来做。

census_day=`head -1 /dr4/home/operbat/batches/nextermCensus.lis | tr -d '\n'`
census_day=$(echo $census_day | tr -d '\n')

答案1

命令:

bla=`head -1 filename`

已经删除了换行符。该echo命令再次附加换行符。

尝试:

echo "$bla\c"

(如果您使用的是 POSIX 兼容的 echo),您将看到$bla.

答案2

默认情况下,echo将在被告知要打印的任何字符串或变量中添加尾随换行符。您的第一个命令完美运行,那里没有换行符,命令替换(`...`或其现代等效命令$(...))会去除每个尾随换行符。仅当您尝试使用该变量时才会添加它echo

例如,给定这个文件:

$ cat foo.txt
a
b
c

我可以保存第一行,不包括换行符,只需使用head

$ census_day=`head -n 1 foo.txt`

现在,如果您要这样做echo,您会看到换行符,但如果您要使用printf, 或echo -n(对于echo支持它的 s),您将不会:

$ printf %s "$census_day" | od -tc
0000000   a
0000001

相关内容