【问题标题】:Sed search and replace syntax in Cygwin?Cygwin中的Sed搜索和替换语法?
【发布时间】:2014-12-16 12:30:48
【问题描述】:

我正在尝试在 Cygwin 中使用 sed 进行搜索和替换:

SRC_FOLDER_MAIN=bra
TGT_FOLDER_MAIN=tag

但以下 sed 命令不起作用:

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' externals.txt > externals_mod.txt

这个例子可以正常工作(将“bra”替换为“tag”):

sed 's/bra/tag/g' externals.txt > externals_mod.txt

我错过了什么?

会不会是 Cygwin 的问题?

【问题讨论】:

  • +1 为您的示例,这可能是一个错字,但有道理!和<tag>一样,bra也必须配对^_^.
  • 已配对?我不明白...?
  • 这是一个极其困难的概念,需要多年的深入研究 :P :P :P
  • 啊,好吧,我明白了...会开始做事的。
  • ……没看懂就忘了……

标签: sed cygwin


【解决方案1】:

要根据变量值替换sed,请用双引号将其括起来并使用简单的变量调用,而不使用{}。另外,$externals*.txt 是否正确?如果您要调用文件,只需输入它们的名称即可。

sed "s/$SRC_FOLDER_MAIN/$TGT_FOLDER_MAIN/g" $externals.txt > $externals_mod.txt

代替

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' $externals.txt > $externals_mod.txt

【讨论】:

  • 双引号不起作用:sed: -e expression #1, char 17: unknown option to `s'
  • 嗯,我明白了,尝试更新后的sed "s/$SRC_FOLDER_MAIN/$TGT_FOLDER_MAIN/g" $externals.txt > $externals_mod.txt。也就是说,变量没有{}
  • 再次出错:sed: -e expression #1, char 17: unknown option to `s'
  • 发布您正在使用的确切命令。我没有添加任何-e-s
  • 这可能很重要,我不知道。检查man sed 看看你是否能找到一些提示。我达到了我的极限:)
【解决方案2】:

如果你需要在sed中传递shell变量,你需要把它们从单引号中取出 试试这样

sed 's/'${SRC_FOLDER_MAIN}'/'${TGT_FOLDER_MAIN}'/g' $externals.txt > $externals_mod.txt

注意' 之前和之后${SRC_FOLDER_MAIN}${TGT_FOLDER_MAIN} 中的类似

更新:示例

[[bash_prompt$]]$ cat log
we will replace aaaa with bbbb
[[bash_prompt$]]$ a=aaaa;b=bbbb
[[bash_prompt$]]$ sed 's/'${a}'/'${b}'/g' log > new_log
[[bash_prompt$]]$ cat new_log
we will replace bbbb with bbbb

【讨论】:

  • 可能,在这种情况下,我不是合适的人。最好在你的问题标签中添加 cygwin
【解决方案3】:

您使用的是标准的 Windows cmd shell 吗?

如果是这样,那么您需要将环境变量包装在 % 符号中,如下所示:

sed 's/%SRC_FOLDER_MAIN%/%TGT_FOLDER_MAIN%/g' externals.txt > externals_mod.txt

【讨论】:

    【解决方案4】:

    如果您对 sed 将接受的字符进行替换,只需使用 awk:

    SRC_FOLDER_MAIN=bra
    TGT_FOLDER_MAIN=tag
    
    awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" '{gsub(src,tgt)}1' "$externals.txt" > "$externals_mod.txt"
    

    这将适用于变量中的任何字符。唯一需要注意的是,与 sed 一样,“源”将被视为正则表达式,因此 RE 元字符(例如“.”或“*”)将是有意义的 - 如果这是一个问题,请告诉我们有一个简单的 awk 解决方案,但没有等效的 sed 解决方案。

    awk 用于查找和替换字符串而不是正则表达式:

    awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" '
        idx = index($0,src) { $0 = substr($0,1,idx-1) tgt substr($0,idx+length(src)) }1
    ' "$externals.txt" > "$externals_mod.txt"
    

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 2010-11-05
      • 2016-04-27
      • 1970-01-01
      • 2020-11-22
      • 2021-02-18
      • 2014-03-14
      • 2015-01-04
      相关资源
      最近更新 更多