如何在 shell 脚本中使用 while 按照空行逐行合并字符文件?

如何在 shell 脚本中使用 while 按照空行逐行合并字符文件?

文件输入.txt包含:

*
*
*
 
 
H 
E 
L 
L 
O 
 
W
O
R
L
D
 
 
*
*
*

我的代码逐行读取每个字符:

while read -n1 c; do
     dest+="${c}"
done < input.txt

echo $dest

结果是:

***HELLOWORLD***

我要这个:

*** 你好世界 ***

答案1

我假设您使用 bash shell 是因为该-n1选项,它不是 POSIXsh标准的一部分。

如果删除-n1,则只会在非空行上read为 赋值。然后,您可以使用以下形式的参数扩展c

   ${parameter:-word}
          Use  Default  Values.  If parameter is unset or null, the expan‐
          sion of word is substituted.  Otherwise, the value of  parameter
          is substituted.

Spacec为空时分配默认值。因此

#!/bin/bash

while read c; do
    dest+=${c:- }
done < input.txt

echo "$dest"

请注意,变量扩展不需要在赋值的 RHS 上加引号 - 但应该在命令中加引号echo,否则$dest将受到 shell 的分词和文件名生成(“通配符”)的影响 - 当变量可能包含*字符时尤其重要。

然后给出

$ cat input.txt
*
*
*


H
E
L
L
O

W
O
R
L
D


*
*
*

你应该得到

$ ./myscript
***  HELLO WORLD  ***

答案2

$ paste -sd "" < input.txt
***  H E L L O  WORLD  ***

我剪切粘贴的您问题中的示例文本中有一些多余的空格。

相关内容