DOCKERFILE是这么写的:
FROM python:3.7.0RUN sed -i s/deb.debian.org/mirrors.aliyun.com/g /etc/apt/sources.list
RUN apt-get cleanRUN apt-get update
RUN apt-get update && apt-get install -y libsasl2-dev python-dev libldap2-dev libssl-dev
COPY ./requirements.txt /
RUN pip3 install --upgrade pip
RUN pip3 install --default-timeout=1000 -i https://pypi.tuna.tsinghua.edu.cn/simple -r /requirements.txt
WORKDIR /src
COPY . /src
CMD ["python", "./app.py"]
第一行有一个RUN sed i 命令其实是在处理文本,准确来说,第一句的命令格式是:
(第一行的命令sed -i 没有用引号括起来,估计是书写错误,没有试过书写错误是不能能实现想要的结果)
sed -i 's///g'
sed -i 's/要被取代的字串/新的字串/g'
加g :匹配每一行从行首到行尾的所有字符
不加g:匹配每一行的行首开始匹配,匹配到第一个符合的字段,就会结束,跳到下一行
下面通过辨析:sed 's///g' 与sed 's///' 的区别来认识这个语法
https://blog.csdn.net/m0_37664906/article/details/78082209
amp1:~ # cat 2 ##查看名为2的文件内容
aaaaaaaaaa
bbbbbbbbbb
cccc ccccc ccccc
dddddd dddddd dddddd
yyyyyyyy yyyyyyyyyyyyy yyyyyyyyyyyyyy
ooooooo ooooooo oooooo ooooooo
然后使用上述语法
amp1:~ # sed 's/\s*//g' 2 ##文件2的所有空白(\s)替换为空
aaaaaaaaaa
bbbbbbbbbb
cccccccccccccc
dddddddddddddddddd
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
ooooooooooooooooooooooooooo
##这里我们并没有定义以"\s"开头##然后加g,结果连中间的“\s”的字符都已经匹配了
如果不加g
amp1:~ # sed 's/\s*//' 2
aaaaaaaaaa
bbbbbbbbbb
cccc ccccc ccccc
dddddd dddddd dddddd
yyyyyyyy yyyyyyyyyyyyy yyyyyyyyyyyyyy
ooooooo ooooooo oooooo ooooooo
##这里跟上一个相比,没有加g,结果只是匹配到了开头的“\s”字符
##说明g进行了一个全局的搜索
##不带g的话,只是匹配每行的第一个字段,后面的不管
关于替换前写的正则表达式(不带g匹配开头)
amp1:~ # sed 's/^\s*//' 2
aaaaaaaaaa
bbbbbbbbbb
cccc ccccc ccccc
dddddd dddddd dddddd
yyyyyyyy yyyyyyyyyyyyy yyyyyyyyyyyyyy
ooooooo ooooooo oooooo ooooooo
##这里的“^”其实是多余的
##但是对于不是以空白符、制表符等开头的字符,加“^”和不加,是有很大区别的,稍后的例子会有说明。
##不带g的话,本身只会匹配开始的结果
关于替换前的正则之二(匹配开头带g)
amp1:~ # sed 's/^\s*//g' 2
aaaaaaaaaa
bbbbbbbbbb
cccc ccccc ccccc
dddddd dddddd dddddd
yyyyyyyy yyyyyyyyyyyyy yyyyyyyyyyyyyy
ooooooo ooooooo oooooo ooooooo
##这里我们指定了以“\s”开头
##然后加g,结果只会匹配第一个符合的字段,g这里也是一个全局的作用#
#但是匹配的条件指定了“开头的空白”。所有结果也是正确的。
从上面的分析,可以的知道在sed命令的s模式中,g是起到一个全局的作用,这个范围是每一行,也就是说是一行为单位,作为一个全局
验证:
P.S.
P.S. 关于文中出现的正则
/^ */ 匹配以空格开头的字符
/^\s/ 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v] /^[[:space:]]*/ 匹配以空格或者是\t制表符开头的字符
【参考】
Linux sed 命令利用脚本来处理文本文件
https://www.runoob.com/linux/linux-comm-sed.html
【软件源】
https://www.cnblogs.com/7day/p/12418757.html
/etc/apt/sources.list 是包管理工具 apt 所用的记录软件包仓库位置的配置文件,
同样的还有位于 /etc/apt/sources.list.d/*.list 的各文件。
sources.list 条目格式
sources.list 文件中的条目一般都有如下所示的形式:
deb http://site.example.com/debian distribution component1 component2 component3
deb-src http://site.example.com/debian distribution component1 component2 component3
档案类型 (Archive type)
条目的第一个词 deb 或是 deb-src 表明了所获取的软件包档案类型。
除了阿里云的镜像,国内还有清华大学镜像、中科大镜像等等,大家可以根据自己的网络连接情况选择合适自己的镜像源。
随着 Ubuntu 16.04 LTS 的发布,Ubuntu 的软件包管理命令也发生了变化,新系统采用了 Debian 项目中所使用的 APT(Advanced Package Tool)来完成各种的不同的任务,APT 命令全面取代了我们之前在 Linux 软件包管理基本操作入门中所介绍的 apt-get、apt-cache 等功能。
Ubuntu 16.04 LTS老版本Ubuntu
apt install 包名 替代 apt-get install 包名
apt remove 包名 替代 apt-get remove 包名
apt search 包名 替代 apt-cache search 包名
apt show 包名 替代 apt-cache show 包名
apt update 替代 apt-get update
apt upgrade 替代 apt-get upgrade
apt list –installed 替代 dpkg –get-selections | grep -v deinstall 替代 dpkg -l
apt list –upgradable apt-get -u upgrade –assume-no
apt edit-sources 替代 echo ‘new line of text’ | sudo tee -a /etc/apt/sources.list
apt autoremove 替代 sudo nano /etc/apt/sources.list
apt purge 包名 替代 apt-get autoremove
【替换软件源】
https://www.jb51.cc/docker/532529.html
https://www.cnblogs.com/amiza/p/10329459.html
https://blog.csdn.net/wojiuguowei/article/details/104752126/
https://blog.csdn.net/acgun00886/article/details/102099553
https://blog.csdn.net/jomesm/article/details/88374156
参数
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!