精华内容
下载资源
问答
  • In my bash script I have an external (received from user) string, which I should use in sed pattern

    本文翻译自:Escape a string for a sed replace pattern

    In my bash script I have an external (received from user) string, which I should use in sed pattern. 在我的bash脚本中,我有一个外部(从用户那里收到的)字符串,我应该在sed模式中使用它。

    REPLACE="<funny characters here>"
    sed "s/KEYWORD/$REPLACE/g"
    

    How can I escape the $REPLACE string so it would be safely accepted by sed as a literal replacement? 如何才能转义$REPLACE字符串,以便sed安全地接受它作为文字替换?

    NOTE: The KEYWORD is a dumb substring with no matches etc. It is not supplied by user. 注意: KEYWORD是一个哑子字符串,没有匹配项等。它不是用户提供的。


    #1楼

    参考:https://stackoom.com/question/1i0x/转义sed替换模式的字符串


    #2楼

    Based on Pianosaurus's regular expressions, I made a bash function that escapes both keyword and replacement. 基于Pianosaurus的正则表达式,我制作了一个bash函数,该函数同时避免了关键字和替换。

    function sedeasy {
      sed -i "s/$(echo $1 | sed -e 's/\([[\/.*]\|\]\)/\\&/g')/$(echo $2 | sed -e 's/[\/&]/\\&/g')/g" $3
    }
    

    Here's how you use it: 使用方法如下:

    sedeasy "include /etc/nginx/conf.d/*" "include /apps/*/conf/nginx.conf" /etc/nginx/nginx.conf
    

    #3楼

    don't forget all the pleasure that occur with the shell limitation around " and ' 不要忘记围绕“和”的shell限制所带来的所有乐趣。

    so (in ksh) 所以(以ksh为单位)

    Var=">New version of \"content' here <"
    printf "%s" "${Var}" | sed "s/[&\/\\\\*\\"']/\\&/g' | read -r EscVar
    
    echo "Here is your \"text\" to change" | sed "s/text/${EscVar}/g"
    

    #4楼

    It's a bit late to respond... but there IS a much simpler way to do this. 做出响应有点晚了...但是有一种更简单的方法可以执行此操作。 Just change the delimiter (ie, the character that separates fields). 只需更改定界符(即,分隔字段的字符)。 So, instead of s/foo/bar/ you write s|bar|foo . 因此,代替s/foo/bar/ ,而是编写s|bar|foo

    And, here's the easy way to do this: 而且,这是执行此操作的简单方法:

    sed 's|/\*!50017 DEFINER=`snafu`@`localhost`\*/||g'
    

    The resulting output is devoid of that nasty DEFINER clause. 结果输出没有讨厌的DEFINER子句。


    #5楼

    Use awk - it is cleaner: 使用awk-它更干净:

    $ awk -v R='//addr:\\file' '{ sub("THIS", R, $0); print $0 }' <<< "http://file:\_THIS_/path/to/a/file\\is\\\a\\ nightmare"
    http://file:\_//addr:\file_/path/to/a/file\\is\\\a\\ nightmare
    

    #6楼

    Warning : This does not consider newlines. 警告考虑换行。 For a more in-depth answer, see this SO-question instead. 有关更深入的答案,请参阅此SO问题 (Thanks, Ed Morton & Niklas Peter) (感谢Ed Morton和Niklas Peter)

    Note that escaping everything is a bad idea. 请注意,转义所有内容不是一个好主意。 Sed needs many characters to be escaped to get their special meaning. Sed需要转义许多字符才能获得其特殊含义。 For example, if you escape a digit in the replacement string, it will turn in to a backreference. 例如,如果您在替换字符串中转义了一个数字,它将变成反向引用。

    As Ben Blank said, there are only three characters that need to be escaped in the replacement string (escapes themselves, forward slash for end of statement and & for replace all): 正如本·布兰克(Ben Blank)所说,替换字符串中只需要转义三个字符(转义自身,语句末尾用正斜杠和&替换所有字符):

    sed -e 's/[\/&]/\\&/g'

    If you ever need to escape the KEYWORD string, the following is the one you need: 如果您需要转义KEYWORD字符串,则需要以下内容:

    sed -e 's/[]\/$*.^[]/\\&/g'

    Remember, if you use a character other than / as delimiter, you need replace the slash in the expressions above wih the character you are using. 请记住,如果您使用/以外的其他字符作为分隔符,则需要在上面使用该字符的表达式中替换斜杠。 See PeterJCLaw's comment for explanation. 请参阅PeterJCLaw的注释以获取解释。

    Edited: Due to some corner cases previously not accounted for, the commands above have changed several times. 编辑:由于以前没有考虑某些极端情况,因此上面的命令已更改了几次。 Check the edit history for details. 查看编辑历史记录以了解详细信息。

    展开全文
  • 如果您需要转义KEYWORD字符串...练习: 把t2.sh 文件里出现的字符串/usr/myinstalled_software/13.0.1.0-187 替换为 ${soft_root} 字符串 #1.定义目标 KEYWORD="/usr/myinstalled_software/13.0.1.0-187"; REPLACE="\$
    如果您需要转义KEYWORD字符串,以下是您需要的:
    sed -e 's/[]\/$*.^[]/\\&/g'
    
    请记住,如果您使用的字符不是/分隔符,则需要将上述表达式中的斜杠替换为您正在使用的字符。
    
    练习: 把t2.sh 文件里出现的字符串/usr/myinstalled_software/13.0.1.0-187 替换为 ${soft_root} 字符串
    
    #1.定义目标
    KEYWORD="/usr/myinstalled_software/13.0.1.0-187";
    REPLACE="\${soft_root}"  #这里前面$加了个\转义,否则shell运行后REPLACE变成空串了.
    
    #2.预先处理目标,经过 sed -e 's/[]\/$*.^[]/\\&/g' 处理变成普通字符串
    ESCAPED_KEYWORD=$(printf '%s\n' "$KEYWORD" | sed -e 's/[]\/$*.^[]/\\&/g');
    ESCAPED_REPLACE=$(printf '%s\n' "$REPLACE" | sed -e 's/[]\/$*.^[]/\\&/g');
    
    #3.执行替换操作
    sed "s/$ESCAPED_KEYWORD/$ESCAPED_REPLACE/g" t2.sh
    
    
    展开全文
  • /g'即可对输入字符串进行转义 场景 sed命令常常被用来对文本做处理,其中一个最经常用到的处理就是替换替换的语法如下: echo $STRING | sed -e 's/<match_pattern>/<replace_pattern>/g' 当然也...

    本文首发于我的Github博客
    本文记录了作者在使用sed命令进行文本替换时,对于使用到的替换模式进行转义处理使用到的sed命令,简单来说:

    • 使用sed -e 's/[]\/$*.^[]/\\&/g'即可对输入字符串进行转义

    场景

    sed命令常常被用来对文本做处理,其中一个最经常用到的处理就是替换,替换的语法如下:

    echo $STRING | sed -e 's/<match_pattern>/<replace_pattern>/g'
    

    当然也可以有其他的变化,不过这是作者使用的最多的方式。

    在使用这些的时候,我们可能会在match_patternreplace_pattern中引用变量,已达到分别管理和增强可读性的目的,比如

    # dummy text
    TEXT="affaflns,fakfnakn"
    REPLACE="ff"
    REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
    

    但是,如果上面引用的REPLACE里面有特殊字符,我们就会遇到问题,比如

    # dummy text
    TEXT="affaflns,fakfnakn"
    REPLACE="/a"
    # 有问题
    REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
    

    我们的本意是将a替换为/a,但是,使用这几条命令,会得到

    sed: 1: "s/a//a/g
    ": bad flag in substitute command: 'a'
    

    这里的原因就是/a中的/是一个特殊字符,如果希望得到我们上述的效果,应该这么操作

    # dummy text
    TEXT="affaflns,fakfnakn"
    REPLACE="\/a"
    # 成功
    REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
    

    我们通过\/进行转义,取得了成功,但是这种方式使得我们编写replace_pattern变得麻烦,而且很不直观,我们希望有一个函数来达到如下效果

    # dummy text
    TEXT="affaflns,fakfnakn"
    REPLACE="/a"
    REPLACE=$(func $REPLACE)
    REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
    

    也就是说,编写replace_pattern时,可以直接编写,而后使用一个函数或者命令自动转义再使用

    解决方案

    stackoverflow

    使用sed -e 's/[]\/$*.^[]/\\&/g'即可

    方案解析

    我们这次的方案就是对原生的replace_pattern做一次替换:

    • match_pattern[]\/$*.^[]
      • 这个正则表达式的结构很具有迷惑性,其实它是一个大的bracket group
      • 也就是说,实际上是[ ]\/$*.^[ ]的结构
      • 意味着匹配]\/$*.^[中的任一字符
    • replace_pattern\\&
      • 这个replace_pattern用到了一个转义字符和一个特殊字符
      • 转义字符\\表示的就是\
      • 特殊字符&表示的是match_pattern匹配到的内容

    综合起来,这个替换语句就是把]\/$*.^[前面全部加上一个斜杠,进行转义

    展开全文
  • 1.去掉字符串中的\(斜杠在shell中和java一样,有转义含义,所以可以用#作为运算符避免混淆) str='\"saasdadas\"' str=str | sed #\##g' 2.去掉字符串中的\"(第二条斜杠用来转义") str=str | sed #\\"##g' ...

    1.去掉字符串中的\(斜杠在shell中和java一样,有转义含义,所以可以用#作为运算符避免混淆)

    str='\"saasdadas\"'

    str=str | sed #\##g'

    2.去掉字符串中的\"(第二条斜杠用来转义")

    str=str | sed #\\"##g'

    3.去掉字符串中的{或者} ({}在shell中用来包裹变量避免混淆,所以要想表示{},需要用''包裹)

    str='{saasdadas}'

    str=str |sed 's/'{'//g'

    str=str |sed 's/'}'//g'

    展开全文
  • sed命令替换字符串

    2020-01-07 14:29:07
    sed命令替换字符串 使用sed命令可以直接替换文件中的字符串,在应用中比较普遍 替换字符串的一般格式为: sed 's/aaa/bbb/g' 其中s表示替换filename文件中每行的第一个匹配到的字符串,如果要替换前三行匹配到的...
  • sed 批量替换字符串

    2019-12-03 10:56:53
    sed命令可以批量替换多个文件中的字符串。 命令如下: sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` 例如:我要把 charset=gb2312 替换为 charset=UTF-8,执行命令: sed -i "s/charset=gb...
  • linux sed 批量替换字符串 一月 21, 2014 ( NO COMMENTS ) Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。 命令如下:sed -i “s/原字符串/新字符串/g” `...
  • shell :linux sed 批量替换字符串

    万次阅读 2018-08-20 15:43:01
    linux sed 批量替换字符串 一月 21, 2014 ( No Comments ) Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。 命令如下: sed -i "s/原字符串/新字符串/g" `...
  • 参考文档 :... Linux sed 批量替换字符串 方法 比如,要将目录/modules下面所有文件中的 zhangsan 都修改成 lisi,这样做: sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /modules` ...
  • 使用单个模式替换sed 's/pattern/replacement/flags' filename,例如echo 'abc' | sed 's/a/A/'-->Abc 使用多个模式同时替换sed 's/pattern1/replacement1/;s/pattern2/replacement2/' file, 例如,sed 's/^\...
  • Sed替换 内容斜杠(/)

    千次阅读 2020-01-21 19:45:45
    比如要替换的内容包含/,默认的替换语句是 sudo sed -i 's/Asia/Shanghai/UTC/' /etc/timezone 由于/Asia/Shanghai 包含 / s语句后的就是分割符,我们用#,替换默认的/分隔符就可以了 sudo sed -i 's#Asia/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,587
精华内容 3,034
关键字:

sed替换带斜杠的字符串