【问题标题】:sed command containing variable not working包含变量的 sed 命令不起作用
【发布时间】:2018-02-01 22:54:38
【问题描述】:

我无法正确获取此命令的语法...我需要更改文件中的变量,其中该变量包含路径。

sessionFolderName=/session_`date '+%y%m%d'`_`date '+%H%M'`

sed "s/sessionFolder=.*/sessionFolder=/"$sessionFolder /home/pi/scripts/settings/settings.sh > tmp
mv tmp /home/pi/scripts/settings/settings.sh

但是结果是:

sed:-e 表达式 #1,字符 35:`s' 的未知选项

【问题讨论】:

  • (1) 我强烈建议使用date '+%y%m%d_%H%M' 来确保日期和时间都是原子的。 (2) 由于替换包含/,您需要将其转义,我们在 sed 命令中使用不同的分隔符:s#search#replace# 而不是 s/search/replace/
  • 所有方法都以某种方式起作用。逃跑是这里的关键。没明白。谢谢你们的帮助!

标签: bash shell variables sed


【解决方案1】:

1) 您需要转义输入中的 /

2)修改sed命令的格式如下图

sessionFolderName=\\/session_`date '+%y%m%d'`_`date '+%H%M'`

sed "s/sessionFolder=.*/sessionFolder="$sessionFolderName"/"  /home/pi/scripts/settings/settings.sh > tmp

【讨论】:

  • 在这里调用date 两次是不好的,因为它会产生两个不同的值。
【解决方案2】:

问题在于变量开头的 / 字符。这会中断 sed 语法:

[root@ ~]# sed "s/sessionFolder=.*/${sessionFolderName}/" text
sed: -e expression #1, char 21: unknown option to `s'
[root@ ~]# echo $sessionFolderName
/session_170824_0942

如果您使用双反斜杠 - \\ 对其进行转义,则可以:

[root@ ~]# sed "s/sessionFolder=.*/sessionFolder=\\${sessionFolderName}/" text
sessionFolder=/session_170824_0942

【讨论】:

    【解决方案3】:
    # You don't need to (and in your case, should not) invoke date command twice.
    # Try running following in bash to see the problem.
    #     $ echo $(date '+%s')_$(sleep 1)_$(date '+%s')
    # On a different note, it's better to use $(...) instead of backticks.
    sessionFolderName="/session_$(date '+%y%m%d_%H%M')"
    
    # You can use several other separators in sed.
    #  e.g. :, ;, @, #, _ and even a space
    sed "s:sessionFolder=.*:sessionFolder=${sessionFolder}:" /home/pi/scripts/settings/settings.sh > tmp
    mv tmp /home/pi/scripts/settings/settings.sh
    

    Refer to this 关于使用$() 代替反引号

    【讨论】:

    • 您在哪里看到date 命令被调用了两次?设置变量时调用一次。稍后引用变量返回变量的,不再执行date命令
    • @Vinny 看看sessionFolder 值是如何设置的。 "sessionFolderName=/session_`date '+%y%m%d'`_`date '+%H%M'`"
    • @Vinny 查看更新后的答案。希望它能更好地澄清事情。
    • @Vinny 我完全理解。问题是调用date 两次以生成值是错误的。因为它可以在两次调用中产生两个不同的值。只需运行echo $(date '+%s')_$(sleep 1)_$(date '+%s'),您就会看到。
    • 你不能重定向到同一个文件!您将丢失文件的内容。
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2017-03-01
    • 2016-10-21
    • 2020-05-23
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多