通过sed

时间:2016-10-02 07:27:59

标签: bash shell unix sed

我有一个文件,我希望使用SED将值附加到每行末尾的unix变量中。

我已经通过AWK实现了这个目标,但我想在SED中实现这一目标

像这样的事情。我已经尝试过以下命令,但它无法正常工作。

sed -i 's/$/"$BATCH_RUN_DATE"/g' data.csv

错误

sed: -e expression #1, char 10: unknown option to `s'

GNU sed版本4.2.1

注意:如果你不知道答案没问题,但不要将其标记为重复。 您提供参考的那个与此问题不同。

此致 Aswinikumar

2 个答案:

答案 0 :(得分:2)

这是一个如何做到的例子:

% cat subject.txt                     
Studid    StudName     Asp.Net   DBMS     Unix
   1       Ani         75        62       80
   2       George      90        95       82
   3       Jake        45        30       40
   4       Dennie      89        92       90
% 
% my_var="R2D2"                       
% 
% sed "s/$/${my_var}/" subject.txt 
Studid    StudName     Asp.Net   DBMS     UnixR2D2
   1       Ani         75        62       80R2D2
   2       George      90        95       82R2D2
   3       Jake        45        30       40R2D2
   4       Dennie      89        92       90R2D2

解释

关于这个sed表达式的棘手问题是为什么我不需要在替换的替换部分中重新插入$换行符?。<登记/> 我相信这是因为当sed将每一行加载到模式空间时它会删除换行符,然后在所有模式空间操作之后,它会重新附加换行符到模式空间的内容然后打印模式空间,所以我猜新线是一种免费的#34;在这里。
然后你可能会问这个问题,如果模式空间中没有换行符,第一个$如何匹配? - 如果我不得不猜测,我可能会说,sed只知道你使用$元字符时的意思,但这只是猜测。

答案 1 :(得分:1)

如果希望bash变量扩展发生,你应该把脚本本身放在双引号中

sed -i "s/$/$BATCH_RUN_DATE/" data.csv

应该做的工作。这是最简单的方法。另外,请注意,您不需要全局标记,因为每行只有一个替换。

<强>图片的标题说明

  • 检查您的sed是否支持就地编辑选项
  • 检查$BATCH_RUN_DATE本身是否为非空。