在sed中使用外部变量

本文最后更新于2016年7月14日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=Start=

缘由:

在编写一个Bash脚本时需要用sed命令对结果进行精简(将某个字符串中经常出现的公共子串用一个短变量名表示),最初的写法是:

find "${base_path}" -maxdepth 1 -type f -iname "*.py*" 2>/dev/null | xargs | tr ' ' ';' | sed -e 's#${base_path}#\${base_path}#g'

但是没有起到作用,当时也比较忙,没有仔细检查问题出在哪了,只是先简单的把最后的sed替换命令给去掉了。现在刚好有点时间,找到了解决办法,在此记录一下,方便以后参考。

正文:
搜索关键字:

linux bash sed search with var

参考解答:

三种方法:

  1. 使用「双引号」而不是「单引号」
  2. 使用多重「单引号」
  3. 使用Bash内置的字符串替换操作(效率最高)。

测试用例如下:

#!/bin/bash

base_path="/root/port_scan"
echo $base_path

py_files="/root/port_scan/py_get_new_port_list2.py.2016-05-19 /root/port_scan/py_get_new_port_list2.py.2016-05-17"
echo $py_files
# echo $py_files | sed -e 's#${base_path}#\${base_path}#g'
echo $py_files | sed -e "s#${base_path}#\${base_path}#g"    #work
echo $py_files | sed -e 's#'${base_path}'#\${base_path}#g'  #work
echo $py_files | sed -e 's#"${base_path}"#\${base_path}#g'
echo $py_files | sed -e 's#/root/port_scan#\${base_path}#g'
echo ${py_files//$base_path/\$base_path}                    #ok
echo ${py_files//$base_path/\${base_path\}}                 #work
参考链接:
另:

之前在使用awk的时候也遇到过一个类似的问题:在awk中使用外部变量。在此也顺便记录一下:如果需要在awk中使用外部的变量,可以借助awk的「-v」选项。

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/2765.html

《在sed中使用外部变量》上的一个想法

  1. 1.在一个sed命令中进行多次替换操作;
    方法一:用大括号包起来
    `echo “url = git@github.com:taizilongxu/interview_python.git” | sed ‘{s#:#/#; s#git@#https://#;}’
    `
    方法二:用多个「-e」选项
    `echo “url = git@github.com:taizilongxu/interview_python.git” | sed -e ‘s#:#/#’ -e ‘s#git@#https://#’
    `
    2.在匹配到的行上进行替换操作;
    `sed -i ‘/url = git@github/{s#:#/#; s#git@#https://#;}’ .git/config
    `

    http://unix.stackexchange.com/questions/155331/sed-replace-a-character-in-a-matched-line-in-place
    http://stackoverflow.com/questions/7573368/in-place-edits-with-sed-on-os-x

发表评论

邮箱地址不会被公开。 必填项已用*标注