如何阻止SED从文本文件中剥离最终换行符

时间:2018-01-29 10:03:20

标签: unix sed

我使用sed更新文本文件中的各种日期格式,并将结果附加到另一个文件。

文件日期存储为YYYMMDD等,因此我将YYYMMDD替换为实际日期。

唯一的问题是每个文件的最后一行都缺少一个新行字符,这意味着最后一行和第一行未正确对齐。

文件1:

00 YYMMDD TEST
05 3452256 MMDD 33456
80 File Trailer    

文件2:

00 YYMMDD TEST
05 445674 MMDD 234456
80 File Trailer    

我需要的是使用当前日期更新的YYMMDD和MMDD以及这两个文件如下:

00 180129 TEST
05 3452256 0129 33456
80 File Trailer
00 180129 TEST
05 445674 0129 234456
80 File Trailer      

但我实际得到的是:

00 180129 TEST
05 3452256 0129 33456
80 File Trailer00 180129 TEST
05 445674 0129 234456
80 File Trailer      

代码:

YYYY=$(date +"%Y")
YY=$(date +"%y")
MM=$(date +"%m")
DD=$(date +"%d")
HH=$(date +"%H")
MI=$(date +"%M")
SS=$(date +"%S")
JJJ=$(date +"%j")

sed -- "s/yyyymmdd/$yyyyMMdd/g;s/yymmdd/$yyMMdd/g;s/mmdd/$mmdd/g;s/yyjjj/$yyjjj/g" "$full_path" >> $deploy_path

有谁知道为什么会这样,如果这是一个简单的解决方法?

修改

事实证明问题出在我使用的源文件上。具体来说:文件预告片缺少CRLF。所以上面的代码工作正常。

1 个答案:

答案 0 :(得分:1)

我首先建议将"$full_path"替换为<(cat "$full_path"; echo),但要意识到您的“$ full_path”将包含2个文件而我的修复仅适用于一个文件。
您可以使用sed$s/$/\n/附加换行符,因此请将命令更改为

sed -- "\$s/$/\n/; s/yyyymmdd/$yyyyMMdd/g;s/yymmdd/$yyMMdd/g;s/mmdd/$mmdd/g;s/yyjjj/$yyjjj/g" "$full_path" >> $deploy_path