如何在shell下的文件行头处理空间?

时间:2017-08-22 10:32:27

标签: shell

我有一个shell脚本将old_file处理成new_file,我想在old_file中重写一行,如下所示:

old_file:

123
  abc
e45

new_file:

123
  abc bca
e45

所以我使用这样的代码:

cat old_file | while read line; do process "$line" > new_file; done

该过程是匹配和重写该行的功能。但是我发现old_file中行首部的空格不像这样:

new_file:

123
abc bca
e45

所以我将代码更改为:

echo "`cat old_file`" | while read line; do echo "$line" > new_file; done

但是old_file中的行将是一行(""有效,有时会得到"文件名太长"错误),我想逐行处理行,不是整条线。

那么如何逐个处理old_file中的行,同时在行首中保留空格?

谢谢〜

1 个答案:

答案 0 :(得分:1)

鉴于您的编辑,有几个问题。首先,您使用错误的工具来完成工作。如果您想将行' abc'更改为' abc bca',则sed是正确的工具。例如,给定old_file

$ cat old_file
123
  abc
e45

您可以通过简单的

完成您想要的任务
$ sed 's/^\s*abc$/& bca/' old_file
123
  abc bca
e45

要编辑文件,只需添加sed -i.bak即可在保存包含原始文件的old_file.bak时更改文件。 (您可以省略.bak并跳过创建备份)

接下来,您的命令cat old_file不必要的猫使用 UUOc )。只需将文件重定向到您的循环,例如

while read -r line; do echo "$line"; done <old_file

注意: read会跳过前导空格。要保留,如果您的shell(例如bash等)为分词提供内部字段分隔符,则设置IFS=将保留前导空格,例如

while IFS= read -r line; do echo "$line"; done <old_file

否则,请检查read实施的选项。

接下来,在process "$line"添加' bca'之后,您只需将所有输出重定向到new_file。在子shell中运行while循环允许您将整个输出重定向到new_file,例如。

(while IFS= read -r line; do process "$line"; done <old_file) >new_file

如果您有任何其他问题,请与我们联系。