我有一个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中的行,同时在行首中保留空格?
谢谢〜
答案 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
如果您有任何其他问题,请与我们联系。