【问题标题】:Add Defined Variable After The First Line Of A Text File在文本文件的第一行之后添加定义的变量
【发布时间】:2014-10-19 02:27:19
【问题描述】:

我正在尝试将定义的 bash 变量插入到文本文档的第一行之后:

sed -i "2i ${storm}" ${HOMEDIR}${PATH1}${YMD}/tmp_tc_tracks

上面的命令对我不起作用...

【问题讨论】:

  • 您是在尝试将 文字字符串 ${storm} 插入到文件中,还是将名为 storm 的环境变量的当前值插入?
  • 您在尝试执行此操作时是否遇到任何错误?还是您的文件看起来有问题?
  • 我设置了一个名为storm的环境变量。
  • storm=awk '{print $2} ${HOMEDIR}{PATH1}${YMD}/tmp_tc_tracks | head -2 |tail -1
  • “上述命令不起作用”不是有用的信息。您收到错误消息吗?如果是这样,那是什么。如果没有,什么不起作用?如果存储在$storm 中的字符串属于某种类型,则您所拥有的内容不适用于所有sed,但它应该与gnu sed 一起使用(我假设您使用的是gnu sed,因为您指定了-i)。字符串是否包含换行符或分号?在回答这个问题之前需要更多的细节。

标签: linux unix text awk sed


【解决方案1】:

尝试像这样转义$

sed -i "2i \${storm}" ${HOMEDIR}${PATH1}${YMD}/tmp_tc_tracks

很可能您的 shell 正试图在您的环境中找到 ${storm},但由于它无法找到它。

没有转义,我看到以下错误:

ryan@bsp1:~/tmp$ sed -i "2i ${asdf}" test.txt
sed: -e expression #1, char 3: expected \ after `a', `c' or `i'

【讨论】:

  • 这是真的。只是尝试一下我的结论垫,仅此而已。
  • 转义 $ 意味着不被 shell 替换,所以在这种情况下没有 var 替换。这用于文字值而不是内容
【解决方案2】:

您可以使用 awk 轻松做到这一点:

$ cat file
line 1
line 2
line 3
$ var="new line"
$ awk -v v="$var" 'NR==2{print v}1' file
line 1
new line
line 2
line 3

如果你想覆盖原始文件,你可以使用标准的技巧,使用中间临时文件:

awk -v v="$var" 'NR==2{print v}1' file > tmp && mv tmp file

【讨论】:

  • 也无法正常工作。目前使用storm=awk '{print $2} ${HOMEDIR}{PATH1}${YMD}/tmp_tc_tracks | head -2 |tail -1
  • 我的命令对我有用,它在文件的第一行之后插入变量。从您的命令来看,您似乎正在尝试分配 $storm 的值,而不是将其插入文件中。请更新您的问题,以明确您要做什么。显示所有变量的值会很有用。还包括输入和所需的输出。
【解决方案3】:
sed "2 i\\
${storm}" ${HOMEDIR}${PATH1}${YMD}/tmp_tc_tracks

var 替换需要双引号,但这也意味着转义 i 命令之后所需的转义字符 (\\) 以及此之后的新行

【讨论】:

    【解决方案4】:

    除了 rkysers 回答之外,单引号也应该起作用

    sed -i '2i ${storm}' file
    

    双引号启用shell扩展,单引号将文本视为文字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 2012-09-21
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多