【问题标题】:Search and replace a string with another string which has backslash within unix file [duplicate]在unix文件中搜索并用另一个具有反斜杠的字符串替换字符串[重复]
【发布时间】:2014-06-23 06:01:45
【问题描述】:

我有一个替换字符串,它在参数replace_str 中捕获。以下带有 sed 替换的命令给出了错误的替换错误:

sed 's/search_str/$replace_str/' 

其中 replace_str 的值带有反斜杠,例如:01/2020

尝试了几个选项,例如使用\,在双引号内等。但它没有帮助。如果您需要更多信息,请告诉我。

感谢您的时间和帮助。

【问题讨论】:

  • 这是因为在解释$replace_str 时,sed 命令有很多斜线。尝试使用另一个分隔符:sed "s_search_str_$replace_str_" 另请注意,您需要双引号才能扩展 var。
  • @fedorqui 下划线作为分隔符?
  • @AvinashRaj 是的,您可以定义它,以及| 或其他。只需使用非常基本的echo "hello" | sed 's_hello_bye_' 即可查看。甚至sed 's?hello?bye?' 也有效。
  • 通过转义特殊字符来准备字符串 $replace_str(在临时变量中使用先前的 sed)。如果只有数字和 /,您可以使用另一个 s/// 分隔符,如 s### 或 s:::
  • @fedorqui:我也试过用双引号。它是一个日期参数,所以我必须使用正斜杠作为首选分隔符。反斜杠也有转机吗?甚至尝试过这种方式: sed 's/***/.echo $replace_str|sed 's/^\(.\{2\}\)/\1\//'/' 其中命令以 mm/yyyy 格式获取日期。请帮忙!!

标签: bash parameters sed


【解决方案1】:

由于我无法在 cmets 中说清楚,因此我将其作为答案发布:

$ var="01/2020"

使用sed "s/... 失败:

$ echo "hello you" | sed "s/hello/$var/"
sed: -e expression #1, char 16: unknown option to `s'

这是因为它被转换成带有很多斜线的东西/: $ echo "你好" | sed "s/hello/01/2020/"

改为使用其他分隔符,例如? 或|:

$ echo "hello you" | sed "s?hello?$var?"
01/2020 you

$ echo "hello you" | sed "s|hello|$var|"
01/2020 you

【讨论】:

  • 哇,成功了。非常感谢您的明确解释。感谢您的所有帮助!!!!!
【解决方案2】:
replace_str_esc="$( echo "${replace_str}" | sed 's|[][\\&]|\&|g' )"
sed "s/{search_str}/${replace_str_esc}/" YourFile

替换字符串更通用(对于单个 /,直接使用 sed 和另一个模式替换分隔符会更快。

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 2011-08-01
    • 2021-10-08
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2020-01-06
    相关资源
    最近更新 更多