sed [OPTION] [expression] file
[OPTION]
-n 屏蔽输出
-i 替换模式
-i.bak 替换前先备份文件
-E 使用扩展正则表达式,语法更接近现代正则表达式(如 Perl、Python、JavaScript),代码更清晰易读(去掉了很多反斜杠),减少转义错误
-e 使用表达式,可使用多个表达式
[expression]
s/regular/replace/ 替换命令
0,/regular/s//replace/ 仅替换从文件开头(第 0 行)首次匹配regular成功的内容,只用GNU版本的sed
/regular/replace/g 匹配整行,默认只匹配一次
/regular/replace/d 删除行
/regular/replace/p 打印匹配的行
sed -n '1,2p' file
# 删除空行
sed -i '/^\s*$/d' merge1.log
sed -i '/^$/d' filename.txt # `^$` 匹配空行
# 按行号删除
sed -i '5d' filename.txt # 删除第5行
# 删除最后一行
sed -i '$d' filename.txt # `$` 表示最后一行
# 删除连续行
sed -i '10,20d' filename.txt # 删除第10到20行
# 删除不连续的行
sed -i '5d;10d;15d' filename.txt # 删除第5、10、15行
# 删除包含特定文本的行
sed -i '/pattern/d' filename.txt # 删除含"pattern"的行
# 删除不匹配的行(保留匹配行)
sed -i '/pattern/!d' filename.txt # `!` 表示取反
# 删除以某文本开头/结尾的行
sed -i '/^prefix/d' filename.txt # 删除以"prefix"开头的行
sed -i '/suffix$/d' filename.txt # 删除以"suffix"结尾的行
sed -i 's/.*a2p_replyclient_log.*[infoerror].[0-9].log.gz://' merge.log \
&& sed -i 's/org.springframework.amqp.rabbit.RabbitListenerEndpointContainer.* - //' merge.log \
&& sed -i '/.*send 1 time for the url is .*/d' merge.log \
&& sed -i '/.*redis key:[0-9]*,value:.*/d' merge.log
sed -i '/>>>>.* retry:2/d' 2021.8.log
sed -i 's/the content of the url:.*receiveStatusReportResultChinaMobile.shtml //' 2021.8.log
sed -i 's/\.[0-9]\{0,3\}\( \[\)/\1/' merge.log
sed -i 's/.*\(\[INFO\]\)/\1/' 2021.8.log
sed -i 's/.*\(\[ERROR\]\)/\1/' 2021.8.log
sed -i 's/time:.*,\(is_china_mobile\)/\1/' 2021.8.log
sed -i 's/error for the url//' merge.log
sed -i 's/can not read content from the url//' merge.log
sed -n '/ status:DELIVRD,/p' result.log | wc -l
sed -n '/"originalStatus":"DELIVRD"/p' merge.log | wc -l
awk '!x[$0]++' merge.log
sort -n merge.log | uniq
sudo sed -i 's/\(archive\|security\).ubuntu/mirrors.aliyun/' /etc/apt/sources.list
sed -i 's/^#\(ClientAliveInterval\) 0$/\1 60/g' /etc/ssh/sshd_config
sed -i 's/^#\(ClientAliveCountMax\) 3$/\1 5/g' /etc/ssh/sshd_config
systemctl restart sshd
# sed 参考 http://man.linuxde.net/sed
# https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html
sed ......
# 配置时区
timedatectl set-timezone Asia/Shanghai
# 关闭邮件服务
systemctl stop 'postfix@*' ; systemctl disable 'postfix@\x2a' ; apt purge postfix
# 配置Shell提示符
echo "PS1='\[\e[36;40m\][\D{%Y-%m-%d} \A] \[\e[0m\] \[\e[35;40m\]\w\[\e[0m\]\n\[\e[33;40m\][\u@\H]\[\e[0m\] \\$ '" >> ~/.bashrc
# 打开自定义命令
sed -E -i.bak \
-e '/(export|eval|alias (ls|ll|l|rm|cp|mv))/s/^# //' ~/.bashrc \
&& . ~/.bashrc
# 配置 sshd
# 允许root密码登录
# 允许密码登录
# 解决SSH自动断开问题
sed -E -i.bak \
-e 's/#(Port 22)/\1/' \
-e 's/#(PermitRootLogin) prohibit-password/\1 yes/' \
-e 's/#(PubkeyAuthentication yes)/\1/' \
-e 's/#(PasswordAuthentication yes)/\1/' \
-e 's/#(AllowTcpForwarding yes)/\1/' \
-e 's/(X11Forwarding yes)/#\1/' \
-e 's/#(Compression delayed)/\1/' \
-e 's/#(ClientAliveInterval) 0/\1 60/' \
-e 's/#(ClientAliveCountMax) 3/\1 3/' \
/etc/ssh/sshd_config \
&& systemctl restart sshd.service
blog.cuile.com
上传后,Settings > Pages > Custom domain 设置中会出现自定义的域名
# config/_default/config.toml
...
baseurl = "https://blog.cuile.com/"
...
其它不过多说明了,网上教程非常多,可以找来看。
参考文档
这可能是https请求报"block:mixed-content"错误导致的,是浏览器不允许在https页面里嵌入http的请求,现在高版本的浏览器为了用户体验,都不会弹窗报错,只会在控制台上打印一条错误信息。
解决这个问题,可以从以下2点入手:
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
# 使用扩展版本
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.92.0'
extended: true
# 使用标准版本
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
[docker|podman] image ls -a
# or
[docker|podman] images
[docker|podman] container ls -a
# or
[docker|podman] ps
[docker|podman] compose -f <yaml_file> logs [-f] [service name]
# or
[docker|podman] logs [-f] [container id]
[docker|podman] compose -f <yaml_file> config
echo 'y' | [docker|podman] system prune
# 导出
[docker|podman] save -o <image>.tar <image_name:label | image_id>
# 导入
# 使用image_id导出的镜像,导入时也没有名字
[docker|podman] load -i <image>.tar
# 创建临时容器
[docker|podman] conatiner create --name <container_name> <image_name>
# 从容器复制文件到宿主机
[docker|podman] conatiner cp <container_name>:<file_path> <dest_path>
# 清理临时窗口
[docker|podman] container rm <container_name>
[docker|podman] network create [name]
echo "alias d-ll='[docker|podman] image ls -a; echo; [docker|podman] container ls -a'" >> ~/.bashrc \
&& echo "alias d-ps='[docker|podman] ps'" >> ~/.bashrc \
&& echo "alias d-clean='[docker|podman] system prune -f'" >> ~/.bashrc \
&& echo "alias d-rm='_a(){ [docker|podman] image rm $1; echo; [docker|podman] container rm $1; }; _a'" >> ~/.bashrc \
&& echo "alias d-exec='_a(){ [docker|podman] exec -it $1 /bin/bash; }; _a'" >> ~/.bashrc \
&& echo "alias d-stop='_a(){ [docker|podman] container stop $1; }; _a'" >> ~/.bashrc \
&& echo "alias d-kill='_a(){ [docker|podman] container kill $1; }; _a'" >> ~/.bashrc
source ~/.bashrc
Python 的 pypi.python.org 站点终于要退休了,而新的接任者 pypi.org 无论从美观、风格上都让人大大的喜欢,终于在审美一这项上及格了。
而且新的 pypi.org 能够正确的渲染 Markdown 格式的描述,实在是让人欣慰,终于可以和 Github 同步了,不用在麻烦的转换一次了。
下面就来聊聊,如何正确的把库发布到 pypi.org 上:
嗯,这是正确的废话!
setup.py 的内容比较重要,但其它的细节不谈,主要聊聊 long_description 部分,这部分是对库能力的详细描述。
如果说 keywords 和 description 能提高别人搜索到项目的概率的话,那 long_description 就在很大程度上决定别人对你对项目有没有进一步的想法了。
在针对 long_description 的网上介绍中,对具体使用方法明确写出的是少之又少,所以我今天就特别举例说明一下。
#!/usr/bin/env python
# coding: utf-8
from setuptools import setup
setup(
name='sequence2hash',
version='1.1.2',
keywords='tuple dict list sequence hash key/value',
packages=['sequence2hash'],
url='https://github.com/Cuile/sequence2hash',
description='This tool converts a valid value in a sequence to a hash and contains a path to a valid value in the key field',
long_description_content_type='text/markdown',
long_description=open('README.md', encoding='utf8').read(),
author='cuile',
author_email='[email protected]'
)
long_description=open('README.md', encoding='utf8').read()
这句代码是较少明确说明的,可以不引用 io 库,而直接使用 open 函数读取文件内容,由于 pypi.org 支持 Markdown ,所以可以和 Github 使用同一份 README.md 文件。