l

群晖上安装个人音乐服务器Navidrome

综述

audiostation 感觉不够轻量,客户端也不够轻量,打开登录都较慢,但有歌词插件
同时audiostation 没有PC端,手机端的美观、操作方便性等,也不能拉取专辑封面,当然大多数时候是自己下载好相关封面

虽然群晖的软件都做得不错,en 还是在很多细节上差强人意

个人音乐服务有了NAS ,是肯定要有一个专业的、好用的,主角登场:Navidrome

Navidrome 是一个开源的基于网络的音乐收藏和流媒体服务器,与 Subsonic/Airsonic 兼容。它让您可以自由地从任何浏览器或移动设备收听您的音乐收藏。就像您的个人 Spotify!

Navidrome特点

  • 处理非常大的音乐收藏
  • 流式传输几乎任何可用的音频格式
  • 读取并使用您精心策划的所有元数据(id3 标签)
  • 多用户,每个用户都有自己的播放次数、播放列表、收藏夹等。
  • 非常低的资源使用率:例如:具有 300GB(~29000 首歌曲)的库,它使用不到 50MB 的 RAM
  • 多平台,可在 macOS、Linux 和 Windows 上运行。还提供了 Docker 镜像
  • 准备使用 Raspberry Pi 二进制文件和可用的 docker 镜像
  • 自动监视您的库的更改、导入新文件和重新加载新元数据
  • 基于 Material UI 的主题化、现代和响应式 Web 界面,用于管理用户和浏览您的图书馆
  • 与所有 Subsonic/Madsonic/Airsonic 客户端兼容。查看经过测试的客户列表
  • 即时转码/下采样。可以为每个用户/玩家设置。支持 Opus 编码
  • 集成音乐播放器

Subsonic API 支持的功能

  • 基于标签的浏览/搜索
  • 播放列表
  • 书签(用于有声读物)
  • 出演(收藏)艺术家/专辑/曲目
  • 五星级
  • 转码
  • 获取/保存播放队列(继续在不同的设备上收听)
  • Last.fm 和 ListenBrainz 搜刮
  • 来自 Last.fm 的艺术家简历
  • 来自Spotify 的艺术家图像(需要配置)
  • 歌词(来自嵌入标签)

安装

网上有 套件版的,但我还是喜欢docker版的,升级、更新、备份方便

在群晖上以 Docker 方式安装。
在注册表中搜索 navidrome ,选择第一个 deluan/navidrome,版本选择 latest

安装时容器端口映射设置:4533,外网访问还需路由器映射
挂载设置:/data 挂载到自己的统一目录下,/music 挂载到自己的音乐文件目录
image.png

环境变量

主要针对 last.fm 和spotify API 进行设置

https://www.last.fm/api/account/create 中创建API 账户

application name:Navidrome

image.png

获取 api key 与 Shared secret ,保存下来

在docker 的安装环境界面新增

1
2
3
4
ND_LASTFM_ENABLED :true
ND_LASTFM_APIKEY: 获取的 api key
ND_LASTFM_SECRET:获取的 Shared secret
ND_LASTFM_LANGUAGE:zh

访问

http://域名:4533 访问,首次需注册管理员

登录就可以看见扫描的专辑

image.png

转码可以利用默认配置,如果需要更改需在环境变量里增加以下变量,就可以在网页客户端进行更改,更改完后一定改为false,否则有安全隐患

1
ND_ENABLETRANSCODINGCONFIG=true

然后在需要转码的客户端上进行设置,不需要转码的就不设置

image.png

客户端

支持的应用
除了可以使用搭建的网页端 Web UI,Navidrome 还可以与以下所有 Subsonic 客户端兼容。以下客户端经过测试并确认可以正常工作:
iOS:play:Sub、 substreamer、 Amperfy和 iSub
安卓:DSub, Subtracks, substreamer, Ultrasonic和 Audinaut
网络:Subplayer、 Airsonic Refix、 Aurial、 Jamstash和 Subfire
桌面:Sublime Music (Linux) 和Sonixd (Windows/Linux/macOS)
CLI:Jellycli (Windows/Linux) 和STMP (Linux/macOS)
连接的扬声器:
Sonos: bonob
Alexa:AskSonic
其他:
Subsonic Kodi 插件、 Navidrome Kodi 插件、 HTTP目录文件系统

在这里,我用的是安卓,把安卓推荐的都试用了一下,还是Ultrasonic 支持中文,也好用,其它substreamer 不错
win 桌面用 Sonixd ,项目地址 https://github.com/jeffvli/sonixd,下载安装即可

针对每个用户、每个终端进行转码品质设置,各使用各的,一切OK 享受吧

PS

转码我使用的OPUS ,相同比特率下 OPUS更好!
变量详细设置:https://www.navidrome.org/docs/usage/configuration-options/ 根据官网说明可对每个细节进行详细设置

l

Safari实现SwitchyOmega的PAC代理功能

Safari 没有开放代理 API,因为 macOS 可以很方便地设置系统级的全局代理,但是全局代理则会导致所有流量走代理服务器。

相比类似于 Chrome + SwitchyOmega (auto switch) 那种代理上网效果(国内正常,国外走代理),Safari 在代理上网方面的扩展程序实在乏善可陈,这篇文章所解决的需求就是在 macOS Safari 平台上实现 Chrome 的这种代理上网方式。

方法:

1)导出Chrome的PAC 文件

从 Chrome 的 SwitchyOmega 扩展程序中将 PAC 文件导出,记得选择自动切换模式下的 PAC 文件。

2)启动一个http server承载PAC文件

在本机存放 PAC 的目录下用 python 直接起HTTP 服务:

1
python -m http.server 11111

3)配置代理

系统偏好设置 👉🏻 网络 👉🏻 高级 👉🏻 代理 👉🏻 选择「自动代理配置」,URL填入刚才的PAC文件的下载地址:

1
http://127.0.0.1:11111/OmegaProfile_auto_switch.pac

Safari.pac就是刚才导出的PAC文件,目的是让系统能够找到PAC文件

4)进程服务自启动

可以用docker/supervisor/systemd类似的工具去管理进程,如果不想让本地维护http服务的话,可以在github中建个项目,把PAC文件上传,通过Github生成调用链接也是没问题的。

l

Telegram群组、频道、机器人汇总分享

最近用上了TG,体验不要太好!

在这里整理了一下网上查找的比较有趣的TG群、频道、机器人等等。我自己也推荐了一些;

Telegram群组、频道、机器人汇总分享

下面的几个网站基本上总结的相当的全了:

我在这里分享几个我目前在用的吧:

资源索引:

技术交流:

娱乐:

资讯:

l

推荐 22 款好用的命令行工具

作者根据多年的终端使用经验,详细介绍了一些实用的 CLI 工具,希望它们能帮读者提高生产力。

我大部分的时间都花费在终端的使用上,我觉得有必要给大家推荐一下比较好用的终端工具。先给大家列个推荐清单,如下图。

图片

高频 CLI 工具推荐

fish shell

Shell- 毋庸置疑,在终端中,Shell 是使用最频繁也最重要的工具。过去,我曾经使用过 Bash 和 Z Shell,而如今,我正在使用的是 Fish Shell。这是一个非常优秀的终端 Shell 工具,拥有许多开箱即用的功能,例如语法自动推荐补全、语法高亮显示或使用快捷键在最近访问的文件夹之间来回切换。

图片

一方面,它非常适合初学者使用,因为使用者无需进行任何设置。另一方面,由于它使用的脚本语法与其他 Shell 有所差异,因此通常用户不能把拷贝自网上的脚本直接粘贴使用。你必须将不兼容的命令更改为合法的 Fish 脚本,或者启动一个 Bash 会话以运行 Bash 脚本。

https://fishshell.com/docs/current/index.html#syntax-overview

我能理解这种更改背后的原因(毕竟 Bash 脚本不是易于用户使用的语言),但这种不兼容丝毫没有给我带来任何好处。我平时很少编写 Bash / Fish 脚本,所以经常遗忘这些语法,因此每次要使用这些脚本时我总是必须从头开始重新学习它。与 Bash 脚本相比,Fish 脚本的资源相对更少。我通常不会去阅读文档,重复造轮子,而是从 StackOverflow 复制粘贴现成的脚本拿来即用。

虽然前面我提到了 Fish Shell 的几个缺点,但是我还是会推荐你去用一下,因为切换 Shell 工具十分简单,所以很值得你去尝试一下。特别是当你懒得自己去配置 Shell,并希望通过最少的配置就能获得很好的使用效果的时候,那就更不要错过它了。

Fish插件

你可以自己添加相关插件来扩展 Fish Shell 的功能。最简单的安装插件的方法就是使用插件管理工具,比如 Fisher、Oh My Fish 或者 fundle。现在,我使用的插件管理工具是 Fisher,我用它安装管理了三个插件:

  1. franciscolourenco/done ——在长时间运行的脚本完成后发送通知。
  2. evanlucas/fish-kubectl-completions——1个自动补全 kubectl(Kubernetes command line tool) 命令的插件。
  3. fzf——将 fzf 工具与 Fish 集成在一起的插件。

过去,我有使用很多的插件(比如 rbenv、pyenv、nodenv、fzf、z),但是我改用其他工具以避免影响我的 Shell 的运行速度(这是我过去使用 Z shell 所得到的一个教训)。

下载地址:https://fishshell.com/

Starship

如果必须要从本篇文章中选择一个我最喜欢的终端工具——那非 Starship 莫属。Starship 可以适用于任何 Shell。你只需要安装它,然后在相应的配置文件.bashrc/.zshrc/config.fish添加一行配置,剩下的工作交给它来完成就好了。

它可以做到:

  • 根据你是否在代码仓库中添加了新文件、是否修改了文件、是否暂存了文件等情况,用相应的符号表示 git 仓库的状态。
  • 根据你所在的 Python 项目目录,展示 Python 的版本号,这也适用于 Go/Node/Rust/Elm 等其他编程语言环境。
  • 展示上一个命令执行所用的时间,指令运行时间必须在毫秒级别。
  • 如果上一个命令执行失败,会展示相应的错误提示符。

还有不计其数的其他信息可以展示。但是,它能以更加友好的形式智能地给你呈现!比如,如果你不在 git 存储库中,它将隐藏 git 信息。如果您不在 Python 项目中,则不会有 Python 版本信息,因为显示它没有什么意义。它永远不会给你展示多余信息,始终保持终端的美观,优雅和简约。

Starship 的运行速度怎么样呢?它是用 Rust 编写的,尽管功能如此之多,但仍然比我以前使用的所有提示工具都要快!我对提示信息非常洁癖,因此我经常破解自己的版本。我会根据现有的提示找到对应的功能代码,然后将其粘组合在一起,以确保 Starship 只有我需要的功能以保持其快速运行。“外部工具永远无法比我精心制作的提示工具更快!” 这就是我对 Starship 持怀疑态度的原因。

下载地址:https://starship.rs/

z

“z”可以让你快速地在文件目录之间跳转。它会记住你访问的历史文件夹,经过短暂的学习后,你就可以使用z path_of_the_folder_name命令在目录之间跳转了。

比如,如果我经常访问 ~/work/src/projects,我只需要运行 z pro ,就可以立马跳转到那里。z 的原理参考了 frecency 算法——一个基于统计 frequency 和 recency 进行分析的算法。如果它存储了你不想使用的路径文件夹,你随时可以手动将其删除。它提高了我在常用的不同文件路径之间频繁切换的效率,帮我节省了键盘击键次数以及大量的路径记忆。

下载地址:https://github.com/rupa/z

fzf

fzf— fuzzy finder,即模糊查找器。它是一种通用工具,可让你使用模糊搜索来查找文件、历史命令、进程、git 提交等。你键入一些字母,它会尝试匹配结果列表中任何位置的字母。输入的字母越多,结果也就越准确。你可能在其他的代码编辑器中有过这种类型的搜索使用体验——当你想打开某个文件时,只键入文件名的一部分而不用输入完整路径就能进行查找——这就是模糊搜索。

图片

我通过 fish fzf 插件插件使用它,因此我可以搜索命令历史记录或快速打开文件。这是可以每天为我节省不少时间的一个非常棒的工具。

https://github.com/jethrokuan/fzf

下载地址:https://github.com/junegunn/fzf

fd

上面动图是 find 命令(左)和 fd 命令(右)的使用对比。

类似于系统自带的 find 命令,但使用起来更简单,查找速度更快,并且具有良好的默认设置。

不管你想找到一个名为“invoice”的文件,但是不确定文件的扩展名,还是查找一个存放所有 invoice 的目录,而不单是一个文件。你可以撸起袖子,开始为 find 命令编写那些复杂的正则表达式,也可以直接命令行运行 fd invoice。反正对我来说,我只选择最简单的那个。

默认情况下,fd 会忽略隐藏的以及在.gitignore列出的文件和目录。大多数时候,这也是我们想要的,但是在极少数特殊情况下,如果需要禁用此功能时,我会给该命令设置一个别名:fda='fd -IH'

你会发现,fd 命令输出的颜色配置很漂亮,而且根据基准测试(上述 GIF),它的执行速度甚至比find 命令的还要快。

下载地址:https://github.com/sharkdp/fd

ripgrep

上图为 grep(左)与 rg(右)命令执行时的对比。

与上述fd指令类似,ripgrepgrep命令的替代方法, 不过ripgrep的执行速度更快,而且具有健全的默认配置以及丰富的彩色输出。

它同样会跳过被.gitignore忽略以及隐藏的文件,因此如果有特殊需要,我们可以设置指令别名:rga ='rg -uuu'。它会禁用所有智能筛选,并使ripgrep的表现与标准的 grep 指令一致。

下载地址:https://github.com/BurntSushi/ripgrep

htop 和 glances

在 Linux 或 Mac 上显示进程运行状态信息最常用工具是我们熟悉的top,它是每位系统管理员的好帮手。而且,即使是像我一样主要从事网络开发,查看计算机的运行状况也很有用。你知道,只是看一下当前到底是 Docker 进程还是 Chrome 进程吃掉了你所有的 RAM,应该如何做吗?

htop工具是top工具的绝佳替代品。

top工具是非常基础的监控工具,提供的功能有限,因此很多人转去使用 htop。htop比起top,优势很明显——除了功能更加完善以外,它的色彩搭配也很丰富,整体上使用起来更加友好。

图片

借助 glances,还可以让你一目了然地快速了解系统当前状态。

glances 是htop的补充工具。除了列出所有进程及其 CPU 和内存使用情况之外,它还可以显示有关系统的其他信息,比如:

  • 网络及磁盘使用情况
  • 文件系统已使用的空间和总空间
  • 来自不同传感器(例如电池)的数据
  • 以及最近消耗过多资源的进程列表

我选择使用htop来筛选和终止进程,因为对我来讲,效率提高了不少,我也使用 glances可以快速浏览一下计算机的运行状况。它提供 API 接口、Web UI 以及支持各种导出格式,因此你可以将系统监视提高到一个新 Level。因此我在这里强烈推荐一波!

htop 下载地址:https://hisham.hm/htop/

glances 下载地址:

https://nicolargo.github.io/glances/

virtualenv 和 virtualfish

Virtualenv 是用于在 Python 中创建虚拟环境的工具(比起内置的venv模块,我更喜欢 Virtualenv)。

图片

VirtualFish 是 Fish Shell 的虚拟环境管理器(如果你不使用 Fish Shell,请查看 virtualenvwrapper)。它提供了许多命令来执行快速创建、列出或删除虚拟环境等操作。

virtualenv 下载地址:

https://pypi.org/project/virtualenv/

virtualfish 下载地址:

https://github.com/justinmayer/virtualfish

pyenv、nodenv 和 rbenv

pyenv 可以轻松实现 Python 版本的切换。

Pyenv、nodenv 和 rubyenv 是用于管理计算机上不同版本的 Python、Node 和 Ruby 的工具。

假设你要在计算机上安装两个版本的 Python。比如,你正在从事两个不同的 Python 项目,或者因为特殊情况仍然需要使用 Python2。不同 Python 版本在电脑上管理很复杂。你需要确保不同的项目具有正确版本的软件依赖包。如果你不小心的话,很容易弄乱这种脆弱的配置并被其他软件包使用的二进制文件所覆盖。

该工具为版本管理提供了很多帮助,并将这一噩梦变得易于管理。它可以全局或“按文件夹”切换 Python 版本,而且每个版本都是相互隔离的。

我最近找到了一种名为 asdf 的工具,该工具可以将 pyenv、nodenv、rbenv 及其他 env 进行统一管理。它提供了几乎所有编程语言的版本管理,下次我需要为编程语言设置版本管理器时,一定会尝试使用一下。

pyenv 下载地址:https://github.com/pyenv/pyenv

nodenv 下载地址:https://github.com/nodenv/nodenv

rbenv 下载地址:https://github.com/rbenv/rbenv

pipx

Virtualenv 解决了 Python 程序包管理中的许多问题,但是还有一个方案可以解决。如果我想在全局环境下安装 Python 软件包(比如它是一个独立的工具,正如前面提到的glances 工具),那么我会遇到全局安装带来的问题。在虚拟环境之外安装软件包不是一个好主意,将来可能会导致意想不到的问题。另一方面,如果我决定使用虚拟环境,那么每次我要运行程序时都需要激活该虚拟环境。这也不是最方便的解决方案。

事实证明,pipx工具可以解决上面提到的问题。它将 Python 软件依赖包安装到单独的环境中(因此不会存在依赖项冲突的问题)。与此同时,这些工具提供的 CLI 命令在全局环境内也可用。因此,我无需激活任何环境——pipx会帮我完成这个操作!

如果你想了解有关 Python 工具的更多信息并想了解如何使用它们,我为 PyCon 2020 会议制作了一个名为“现代 Python 开发人员工具包”的视频。

图片

这是一个长达两个小时的视频教程,内容涉及如何设置 Python 开发环境,要使用的工具以及如何从头开始制作 TODO 应用程序(包括测试和文档)。你可以在 YouTube 上进行观看。

https://www.youtube.com/watch?v=WkUBx3g2QfQ

pipx 下载地址:

https://github.com/pipxproject/pipx

ctop 和 lazydocker

ctop 的实时监控示例

当你使用 Docker 并对其监控时,这两个工具会很有帮助。ctop是 Docker 容器的顶级接口。它可以为你:

  • 展示正在运行和已停止的容器列表。
  • 展示统计信息,例如内存、CPU 使用率以及针对每个容器的其他详细信息窗口(例如绑定的端口等其他信息)。
  • 提供快捷菜单,方便快速停止、杀掉指定容器进程或显示给定容器的日志。

这比你尝试从docker ps命令中找出所有这些信息要方便多了。

图片

lazydocker是我最喜欢的 Docker 工具

如果你认为ctop很酷,请你尝试使用 lazydocker 后再做决定!它是一个非常成熟的拥有终端 UI 界面的工具,提供了非常丰富的功能用于管理 Docker。这是我最喜欢的 Docker 管理工具!

ctop 下载地址:https://github.com/bcicen/ctop

lazydocker 下载地址:

https://github.com/jesseduffield/lazydocker

低频 CLI 工具推荐

除了几乎每天都在使用的工具以外,我多年来还收集了一些给力的工具,这些工具对于一些特定需求非常好用。比如有的终端工具可以用来将终端操作记录成 GIF(并且可以让你在 GIF 中暂停和复制文本!),还有的终端工具可以用于列出目录结构、连接数据库等,下面我会一一介绍。

Homebrew

图片

如果你使用的是 Mac,那我就无需再介绍 Homebrew 了。它是 macOS 上被业界普遍认可的软件包管理器。对了,它还有一个称为 Cakebrew 的 GUI 版本软件,如果感兴趣你可以尝试一下。

下载地址:https://brew.sh/

asciinema

asciinema是可用于记录终端会话的工具。但是,与录制 GIF 不同,它可以让用户选择并复制这些录制中的代码!

这对于录制编码教程来说十分好用。你应该遇到那种尴尬的情况——当你准备跟着视频教程在终端中敲巨长的命令,但是讲师并为你提供这个代码段,你不得不花费很长的时间去整理这些冗长的命令。asciinema录制的内容,支持直接复制,十分给力。

下载地址:https://asciinema.org/

colordiff 和 diff-so-fancy

我很少在终端中使用diff操作(比较两个文件之间的差异),但是如果你需要执行这个操作,可以放弃使用diff命令,而是使用 colordiffcolordiff输出可以高亮显示,因此在查看文件差异内容时要方便得多,而不是在diff命令输出内容下,费力地查看所有的“ <”和“>”符号来对比文件差异。

如果你觉得还不够,那么我推荐给你 diff-so-fancy。它是比colordiff更友好的一个差异对比工具。

它通过以下方式进一步改善了文件内容差异展示的外观:

  • 突出显示每一行中差异的单词,而不是整行
  • 简化变更文件的标题
  • 去除 + 和 - 符号(颜色差异展示就够了)
  • 清楚地指出新行和删除的空行

colordiff 下载地址:https://www.colordiff.org/

diff-so-fancy 下载地址:https://github.com/so-fancy/diff-so-fancy

tree

你可以通过brew install tree安装该工具。如果要查看给定目录的内容,那么 tree 是执行此操作的必备工具。它能以漂亮的树状结构显示所有子目录及文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tree .
.
├── recovery.md
├── README.md
├── archive
├── automator
│ ├── Open\ Iterm2.workflow
│ │ └── Contents
│ │ ├── Info.plist
│ │ ├── QuickLook
│ │ │ └── Thumbnail.png
│ │ └── document.wflow
│ └── Start\ Screen\ Saver.workflow
├── brew-cask.sh

bat

图片

类似于在终端中常用的用于显示文件内容的cat命令,但是bat效果更佳。

它增加了语法高亮显示,git gutter 标记(如果适用),自动分页(如果文件很大)等功能,并且使得输出的内容阅读起来更加友好。

bat 下载地址:https://github.com/sharkdp/bat

httpie

图片

如果你需要发送一些 HTTP 请求,但发现使用curl不够直观,那么请尝试一下httpie。这是一款非常好用的curl替代工具。合理的默认配置以及简洁的语法使它更易于使用,命令返回也是彩色输出,甚至支持为不同类型的身份验证安装相应的插件。

httpie 下载地址:https://httpie.org/

tldr

简化版的命令帮助手册。“man pages” 包含了 Linux 软件的手册,这些手册解释了如何使用给定的命令。你可以尝试运行man catman grep来查看相关命令的帮助手册。它们描述的非常详细,有时可能难以掌握。因此,tldr社区的目的,就是将每个命令的帮助手册进行简化,方便用户查阅。

tldr适用于几乎所有的受欢迎的软件。正如我提到的,这是社区的努力和功劳,虽然不太可能包含所有的软件的简化帮助手册。但是当某个帮助手册被纳入管理并起作用时,它提供的信息通常就是你要查找的内容。

比如,如果你要创建一些文件的 gzip 压缩存档,man tar可以为你提供可能的参数选择。而tldr tar会列出一些我们常见的示例——如图所示,第二个示例正是你要执行的操作:

图片

“man pages”展示的信息太全面了,但是很多时候使用tldr可以更快地帮你找到特定信息,这才是用户真正想要的。

tldr 下载地址:https://tldr.sh/

exa

exals命令的一个可替代方案。

它色彩艳丽,还可以显示 git 状态等其他信息,自动将文件大小转换为方便人们阅读的单位,并且所有这些都保持与ls几乎相同的执行速度。虽然我很喜欢这个工具并推荐给你们,但由于某种原因,我仍然坚持使用 ls。

exa 下载地址:https://the.exa.website/

litecli 和 pgcli

图片

这是我首选的 SQLite 和 PostgreSQL CLI 的解决方案。借助自动提示和语法突出显示,它们比默认的sqlite3psql工具要好用很多。

litecli 下载地址:https://litecli.com/

pgcli 下载地址:https://www.pgcli.com/

mas

mas是一个用于从 App Store 安装软件的 CLI 工具。我目前为止,我仅仅使用过它一次——设置我的 Macbook 电脑软件。将来,我也将使用它来设置我的下一台 Macbook。mas可让你自动在 macOS 中安装软件。它解放了你大量的点击操作。而且,鉴于你正在阅读这篇有关 CLI 工具的文章,所以我大胆地认为,大家都和我一样,不喜欢无聊的单击操作。

我在“灾难修复”脚本中保留了从 App Store 安装的应用程序列表。如果我的电脑真的发生了什么意外情况,我希望能够以最小的代价重新安装所有内容。

mas 下载地址:https://github.com/mas-cli/mas

ncdu

图片

这是在终端进行磁盘分析时使用的工具,它使用起来简单快捷。当我需要释放一些硬盘空间时,会默认使用这款工具。

ncdu 下载地址:https://dev.yorhel.nl/ncdu

my-cli

终端mysql客户端

总结

以上推荐工具清单确实很长,但是我希望有一些工具真的能够带给你方便,提高你的生产力。fdripgrephttpie等工具可能是你以前熟悉的工具的改进版本。这些工具的改进版本除了更易于使用之外,它们还提供更友好的输出,执行速度甚至更快。所以,我们要多多尝试并接受新的事物,不要仅仅因为大家都在使用旧工具而只局限在旧工具的使用上。事物都是在向前发展的,穷则变,变则通,通则久。大家一起共勉。

l

V2ray Linux客户端v2rayA使用教程和全局代理

源地址:https://github.com/v2rayA/v2rayA

我这里直接只用docker

1
2
3
4
5
6
7
8
docker run -d \
-p 2017:2017 \
-p 20170-20172:20170-20172 \
--restart=always \
--name v2raya \
--privileged=true \
-v /etc/v2raya:/etc/v2raya \
mzz2017/v2raya

部署完毕后,访问该机器的2017端口即可使用,如http://localhost:2017

img

添加完节点后在Linux里添加socks或者http(s)代理

参考:https://zhuanlan.zhihu.com/p/46973701

img

方法一:(推荐使用)

为什么说这个方法推荐使用呢?因为他只作用于当前终端中,不会影响环境,而且命令比较简单

在终端中直接运行:

1
export http_proxy=http://proxyAddress:port

如果你是SSR,并且走的http的代理端口是12333,想执行wget或者curl来下载国外的东西,可以使用如下命令:

1
export http_proxy=http://127.0.0.1:20171

如果是https那么就经过如下命令:

1
export https_proxy=http://127.0.0.1:20171

方法二 :

这个办法的好处是把代理服务器永久保存了,下次就可以直接用了

把代理服务器地址写入shell配置文件.bashrc或者.zshrc 直接在.bashrc或者.zshrc添加下面内容

1
2
export http_proxy="http://localhost:port"
export https_proxy="http://localhost:port"

或者走socket5协议(ss,ssr)的话,代理端口是1080

1
2
export http_proxy="socks5://127.0.0.1:20170"
export https_proxy="socks5://127.0.0.1:20170"

或者干脆直接设置ALL_PROXY

1
export ALL_PROXY=socks5://127.0.0.1:20170

最后在执行如下命令应用设置

1
source ~/.bashrc

或者通过设置alias简写来简化操作,每次要用的时候输入setproxy,不用了就unsetproxy。

1
alias setproxy="export ALL_PROXY=socks5://127.0.0.1:20170" alias unsetproxy="unset ALL_PROXY"

方法三:

改相应工具的配置,比如apt的配置

1
sudo vim /etc/apt/apt.conf

在文件末尾加入下面这行

1
Acquire::http::Proxy "http://proxyAddress:port"

重点来了!!如果说经常使用git对于其他方面都不是经常使用,可以直接配置git的命令。

使用ss/ssr来加快git的速度

直接输入这个命令就好了

1
2
git config --global http.proxy 'socks5://127.0.0.1:20170' 
git config --global https.proxy 'socks5://127.0.0.1:20170'

如何全局代理

原地址:https://www.xpath.org/blog/0015707906789019d24776f72a14223abc103b4f80fe003000

安装redsocks

1
apt install redsocks

安装完成以后,默认配置文件:/etc/redsocks.conf
一些常用的命令:

1
2
3
4
5
sudo service redsocks start     #打开redsocks
sudo service redsocks stop #停止redsocks
sudo service redsocks restart #重启redsocks
sudo systemctl enable redsocks #开机启动redsocks
sudo systemctl disable redsocks #停止开机启动redsocks

配置redsocks

编辑redsocks配置文件/etc/redsocks.conf
找到redoscks节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
redsocks {
/* `local_ip' defaults to 127.0.0.1 for security reasons,
* use 0.0.0.0 if you want to listen on every interface.
* `local_*' are used as port to redirect to.
*/
local_ip = 127.0.0.1;
local_port = 12345; //这个端口默认就行,只要跟你以后iptables,重定向的端口一样就ok

// `ip' and `port' are IP and tcp-port of proxy-server
// You can also use hostname instead of IP, only one (random)
// address of multihomed host will be used.
ip = 127.0.0.1; //本地v2ray客户端,地址就是127.0.0.1
port = 20170; //v2ray客户端的端口,默认就是1080


// known types: socks4, socks5, http-connect, http-relay
type = socks5; //使用的代理类型

// login = "foobar";
// password = "baz";
}

修改正确的配置以后,重启redsocks即可

配置iptables

大佬写了一个脚本附带注释,方便不太懂iptables的同学们来使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#file name iptables.sh

#!/bin/bash
if [ $# -lt 1 ]

#不重定向目的地址为服务器的包
then
echo -en "\n"

echo "Iptables redirect script to support global proxy on ss for linux ... "
echo -en "\n"
echo "Usage : ${0} action [options]"
echo "Example:"
echo -en "\n"
echo "${0} start server_ip To start global proxy"
echo "${0} stop To stop global proxy"
echo -en "\n"

else
if [ ${1} == 'stop' ]
then
echo "stoping the Iptables redirect script ..."
sudo iptables -t nat -F
fi
if [ ${1} == 'start' ]
then
if [ $# -lt 2 ]
then
echo -e "\033[49;31mPlease input the server_ip ...\033[0m"
else
##不重定向目的地址为服务器的包
sudo iptables -t nat -A OUTPUT -d ${2} -j RETURN #请用你的shadowsocks服务器的地址替换$SERVER_IP
# #不重定向私有地址的流量
sudo iptables -t nat -A OUTPUT -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A OUTPUT -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN

#不重定向保留地址的流量,这一步很重要
sudo iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN

# #重定向所有不满足以上条件的流量到redsocks监听的12345端口
sudo iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports 12345 #12345是你的redsocks运行的端口,请根据你的情况替换它
fi
fi
fi

使用方法很简单,就两条命令

1
2
3
4
#ip是你的sha服务器的ip,开启全局代理
./iptables.sh start ip
./iptables.sh stop
#结束全局代理,这句是不用全局代理之后,必须运行的,否则是没有办法上网的
l

正则表达式 删除 Java 代码中的注释

想如何删掉所有java 或xml 中的注释,还在寻找eclipse 中的快捷键了吗,你out了,现在都用正则表达式了、

首先我们了解java 中的注释无非3种:

1
2
3
//        单行注释    
/* */ 多行注释
/** */ 文档注释

我们可以使用 Ctrl+F 中替换方式来解决,把注释都替换为为空,这样就解决了删除注释的目的。这里我们需要用到正则表达式 在options 中选择Regular expression 。在上面方框填入正则表达式

删除 java 注释 /* */:

1
/\*{1,2}[\s\S]*?\*/

删除 java 注释 //:

1
//[\s\S]*?\n

删除xml注释:

1
<!-[\s\S]*?-->

删除空白行:

1
^\s*\n

\n或者是\r\n 或者是\r 都可能是换行符,要看你的系统是windows还是Unix/Linux或者是mac的系统

l

hlink安装及重启脚本(威联通篇)

大家应该对hlink比较熟悉了。

它能近乎完美地按规则为我们创建一个“影子”媒体库。

对这个“影子”媒体库进行刮削、重命名、改变文件夹结构,都不会影响源文件夹的PT做种。

完善的黑白名单功能,可以满足我们对各类文件的硬链需求。

不管是硬链原盘、重编码视频,亦或是音频书籍。hlink都能完美胜任。

甚至还能处理PT客户端校验失败的情况。

用过的人都说好

那么今天就来最后一篇教程,也是相对最复杂的一篇。

威联通下,使用hlink。

话不多说,马上开始。


hlink安装需要nodejs环境,第一步我们给威联通安装nodejs。

来到nodejs官网下载界面

我们这里选择linux X64版本(其他系统类似,选择合适自己的版本)

下载文件为node-v14.17.0-linux-x64.tar.xz

img

下载完成后把安装文件放入威联通里,我这里直接拖入威联通共享盘。

img

我这里威联通内文件实际路径是 /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/node-v14.17.0-linux-x64.tar.xz (威联通数据盘的的绝对路径是/share/CACHEDEV*_DATA/*******)

大家根据自己实际的路径来,不要死记照抄。

下面我们打开威联通SSH控制台,解压安装nodejs。

进入刚刚保存安装包的目录,命令如下(根据你的实际安装包存放路径填写)。

cd /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/

解压安装nodejs,命令如下(根据你的实际安装包名称填写)

tar -xvf node-v14.17.0-linux-x64.tar.xz

img

等待解压安装完成。完成后可以输入ls命令查看解压安装是否成功。有安装包同名文件夹存在就OK。

最后我们要把nodejs变为全局可用,输入并执行下面两条软连接命令即可。

ln -s /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/node-v14.17.0-linux-x64/bin/npm /usr/local/bin/

ln -s /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/node-v14.17.0-linux-x64/bin/node /usr/local/bin/

img

(注意路径部分是我们自定义安装nodejs的实际路径,根据个人情况自己填写,可以在威联通FileStation界面查看。)

完成nodejs环境的安装以后,我们就可以安装hlink程序了。

输入安装命令安装hlink,并等待安装完成。

npm install -g hlink

安装完成以后我们再配置一下hlink为全局可用(参考前面的配置nodejs全局可用)。

执行软链接命令

ln -s /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/node-v14.17.0-linux-x64/bin/hlink /usr/local/bin/hlink

这样就完成hlink安装,并且配置好了环境变量。可以正常使用hlink了。

hlink硬链接命令为

hlink “源路径” “目标路径”

路径部分使用绝对路径,并且建议用半角””标注,可以避免路径内文件夹名称有空格导致命令识别错误。

示例:

hlink “/share/CACHEDEV1_DATA/QNAP-ESXI/media/PT” “/share/CACHEDEV1_DATA/QNAP-ESXI/media/NFS”

img

完美运行

以上就是威联通下hlink安装和基本使用方法。


进阶功能

软件功能可以在SSH输入命令

hlink –help

查看

一般我们只需要用到白名单或者黑名单功能就好了。

要使用黑名单模式,必须把hlink默认使用的白名单配置参数去除。首先我们生成配置文件。

执行

hlink -g

img

就可以生成hlink配置文件hlink.config.js

我这里生成路径为/share/homes/admin/hlink.config.js

然后编辑hlink.config.js配置文件

执行命令

vi /share/homes/admin/hlink.config.js

img

可以看到默认配置文件内容如上图。

图上includeExtname部分为hlink默认硬链的格式。

这里要把includeExtname项默认的内容都删掉,否则excludeExtname黑名单模式不生效。

删掉includeExtname内容就可以实现全内容硬链(hlink命令 “源路径” “目标路径”)、白名单硬链(hlink命令 -i=xxx “源路径” “目标路径”)、黑名单硬链(hlink命令 -e=xxx “源路径” “目标路径”)三种模式手动控制。

(按 i 键,进入编辑模式)

img

修改完成保存配置文件即刻生效。

(按 esc 退出编辑模式,键入 :wq 保存编辑)

这里我们要多加一步操作,把hlink.config.js配置文件复制到一个自定义路径,原因跟之前的unraid一样。威联通重启以后也会重置环境变量,hlink配置文件的默认生成目录也会被重置清空。

执行复制命令

cp /share/homes/admin/hlink.config.js /share/CACHEDEV1_DATA/QNAP-ESXI/hlink/hlink.config.js

这里我把修改好的默认配置文件,复制到了/share/CACHEDEV1_DATA/QNAP-ESXI/hlink/hlink.config.js

大家请根据自己实际情况来写。

这样我们就配置好hlink配置文件了,后面正式开始使用hlink。


黑白名单使用方法如下

白名单功能命令为-i,可以指定仅需要硬链接的格式。比如我只需要硬链接.MKV格式的文件。则命令如下(以使用部分的命令为例),注意空格。

hlink -i=mkv “/share/CACHEDEV1_DATA/QNAP-ESXI/media/PT” “/share/CACHEDEV1_DATA/QNAP-ESXI/media/NFS”

如果需要多个格式类型,则在-i=后写入,以半角逗号隔开,比如需要连接.MKV、.MP4、.MOV格式,则命令如下(以使用部分的命令为例),注意空格。

hlink -i=mkv,mp4,mov “/share/CACHEDEV1_DATA/QNAP-ESXI/media/PT” “/share/CACHEDEV1_DATA/QNAP-ESXI/media/NFS”

运行参考图

img

黑名单功能命令为-e,可以指定不需要硬链接的格式。比如我们不需要硬链接.nfo格式的文件。则命令如下(以使用部分的命令为例),注意空格。

hlink -e=nfo “/share/CACHEDEV1_DATA/QNAP-ESXI/media/PT” “/share/CACHEDEV1_DATA/QNAP-ESXI/media/NFS”

如果需要多个格式类型,则在-e=后写入,以半角逗号隔开,比如不需要连接.nfo、.jpg、.png、.bmp格式(这几个格式文件,进行刮削很可能会被改动,所以一定要排除。因为硬链接修改目标文件也会导致源文件同步修改,会影响做种。),则命令如下,注意空格。

hlink -e=nfo,jpg,png,bmp “/share/CACHEDEV1_DATA/QNAP-ESXI/media/PT” “/share/CACHEDEV1_DATA/QNAP-ESXI/media/NFS”

运行参考图

img


想全自动执行的话,需要在威联通的crontab里添加你需要的硬链接命令,设定自己需要的时间间隔,定时自动执行就可以了。我们要用admin账户编辑crontab配置,执行命令

vim /etc/config/crontab

按i进入编辑模式

在最后加上我们需要的hlink命令,间隔按照crontab规则写。

比如每小时执行一次,则添加的命令如下。

0 */1 * * * hlink -e=nfo,jpg,png,bmp “/share/CACHEDEV1_DATA/QNAP-ESXI/media/PT” “/share/CACHEDEV1_DATA/QNAP-ESXI/media/NFS”

示例

img

(按 esc 退出编辑模式,键入 :wq 保存编辑)

执行

crontab /etc/config/crontab

应用计划任务

执行

crontab -l

检查一下计划任务是否已生效

img

确认生效以后,hlink就可以后台全自动硬链接,无需人工干预。

你只需要让你的媒体库(emby、jellyfin、plex、video station)自动读取刮削目标文件夹内容就可以啦。

不论怎样刮削改名改变文件夹层级,都完全不会影响PT做种。


特别注意!

因为威联通系统的特性。

重启以后系统环境变量会重置。

hlink生成配置文件的默认目录也会被重置清空。

所以我们要把前面配置过的软连接命令设置成开机自动执行脚本。

还要把前面复制到自定义路径的配置文件链接到默认生成目录。

这样每次重启才能正常使用hlink命令。

SSH下执行

mount $(/sbin/hal_app –get_boot_pd port_id=0)6 /tmp/config

执行

vim /tmp/config/autorun.sh

按i进入编辑模式

img

在autorun.sh中加入四条命令

ln -s /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/node-v14.17.0-linux-x64/bin/hlink /usr/local/bin/hlink

ln -s /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/node-v14.17.0-linux-x64/bin/npm /usr/local/bin

ln -s /share/CACHEDEV1_DATA/QNAP-ESXI/nodejs/node-v14.17.0-linux-x64/bin/node /usr/local/bin

ln -s /share/CACHEDEV1_DATA/QNAP-ESXI/hlink/hlink.config.js /share/homes/admin/hlink.config.js

前三条是配置环境变量的命令

第四条命令是把我们前面拷贝出来的,已经修改好的hlink配置文件,“复制”回生效路径。

修改完成保存。

(按 esc 退出编辑模式,键入 :wq 保存编辑)

给autorun.sh添加执行权限

chmod +x /tmp/config/autorun.sh


最后我们来到威联通控制台-硬件-启动时运行用户定义的进程

img

可以点击autorun.sh看看我们配置的脚本是否成功。

img

确认脚本正确以后,记得点击控制台的应用。

这样就完全配置好整个环境和运行计划。

l

nas定时任务

1
2
3
0 23 * * * /opt/bin/cp -rf ~/.zshrc /share/CACHEDEV1_DATA/zsh
0 23 * * * /opt/bin/cp -rf ~/.zsh_history /share/CACHEDEV1_DATA/zsh
0 23 * * * /opt/bin/cp -rf ~/.oh-my-zsh /share/CACHEDEV1_DATA/zsh
l

Word技巧:如何使用正则表达式高效替换

1. 引言

在日常生活中,我们经常需要使用 Word 的查找与替换功能来处理一些简单数据。如果数据相对复杂,我们就需要借助 Word 的正则表达式。关于正则表达式,我们先来定义以下术语:

  • 通配符:指的是可以用来代表一个或多个字的字符。例如,星号 * 通常代表一个或多个字符,问号 ? 通常代表单个字符;
  • 正则表达式:指的是可以用来查找和替换文本模式的文本字符和通配符组合。文本字符指的是必须存在于目标文本字符串中的文本,通配符指的是目标字符串中可能各不相同的文本。
描述 类型 示例
任一字符 ? s?t 可找到 “sat” 和 “set”
任何字符串 * s*d 可找到 “sad” 和 “started”
单词开头 < <(inter) 可找到 “interesting” 和 “intercept”,但找不到 “splintered”
单词结尾 > (in)> 可找到 “in” 和 “within”,但找不到 “interesting”
指定字符之一 [ ] w[io]n 可找到 “win” 和 “won”
此范围内的任一字符 [-] [r-t]ight 可找到 “right” 和 “sight”,范围必须是升序
除了括号内范围中的字符之外的任一字符 [!x-z] t[!a-m]ck 可找到 “tock” 和 “tuck”,但找不到 “tack” 或 “tick”
前一个字符或表达式的 n 个匹配项 {n} fe{2}d 可找到 “feed”,但找不到 “fed”
前一个字符或表达式的至少 n 个匹配项 {n,} fe{1,}d 可找到 “fed” 和 “feed”
前一个字符或表达式的 n 到 m 个匹配项 {n,m} 10{1,3} 可找到 “10”、”100” 和 “1000”
前一个字符或表达式的一个或多个匹配项 @ lo@t 可找到 “lot” 和 “loot”

2. 内容转置

本节介绍了如何使用正则表达式转置姓名、转置日期。

2.1 转置姓名

第一步,启动 Word,打开一个新的空白文档。复制此文字,将它粘贴到该文档中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Josh Barnhill
Doris Hartwig
Tamara Johnston
Daniel Shimshonig

第二步,在「开始」选项卡上的「编辑」组中,单击「替换」以打开「查找和替换」对话框。

第三步,选中「使用通配符」复选框。若没有看到「使用通配符」复选框,请单击「更多」,然后选中该复选框。没有选中该复选框时,Word 会将通配符视作文本。

第四步,在「查找内容」框中键入 `(<*>) (<*>)`。注:两组括号之间包含了空格。

第五步,在「替换为」框中,键入 `\2, \1`。注:在逗号和第二个斜杠之间包含了空格。然后单击「全部替换」。Word 会转置这些姓名并使用逗号分隔它们。

![img](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/2022/10/31/xFEc5V.png)

关于正则表达式,在第一个表达式 `(<*>) (<*>)` 中:

- 星号 `*` 代表任意字符串,会返回单词中的全部文本;
- 小于和大于符号 `< >` 分别标记了每个单词的开始和结束。它们确保搜索会返回单个单词;
- 它们之间的括号和空格将单词拆分成不同的组,即 (第一个单词) 和 (第二个单词)。

在第二个表达式 `\2, \1` 中:

- 斜杠 `\` 与数字放在一起充当占位符;
- 第一个占位符后的逗号,是在两个被转置的姓名之间插入想添加的标点符号;
- 该表达式含义是,写入第二个单词,添加逗号,写入第一个单词。

### 2.2 转置日期

第一步,启动 Word,打开一个新的空白文档。复制此文字,将它粘贴到该文档中。注意粘贴时只保留文本。

28th May 2003
1st Jun 2008
2nd Feb 2010
3rd Apr 2020

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

第二步,按照上文描述打开「查找和替换」对话框,并选中「使用通配符」复选框。

第三步,在「查找内容」框中键入 `([0-9]{1,2})([dhnrst]{2}) (<[ADFJMNOS]*>) ([0-9]{4})`。

第四步,在「替换为」框中,键入 `\3 \1, \4`。注:确保在每个字符集之间插入空格。

第五步,单击「全部替换」。

![img](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/2022/10/31/HuEomc.png)

关于正则表达式,第一个表达式 `([0-9]{1,2})([dhnrst]{2}) (<[ADFJMNOS]*>) ([0-9]{4})` 的作用是将日期分解为四个部分,由多组括号来表示。具体来看:

- 第一部分 `([0-9]{1,2})`。数字范围 `[0-9]` 匹配第一个模式中的一位数数字。因为日期可以由两个数字组成,我们让搜索返回一位数或两位数的日期 `{1,2}`;
- 第二部分由序数词组成。序数词包含 "th""nd""st""rd",因此我们将这些字母添加到范围 `[dhnrst]` 中。因为序数词总是由两个字母组成,我们将字母计数限制为 2,即 `([dhnrst]{2})`;
- 第三部分是查找月份名的文本字符和通配符。所有月份名都以这些大写字母开头 "ADFJMNOS"。我们不知道每个大写字母后有多少个字符,因此我们在它们之后使用星号 `*`。我们只对月份名本身感兴趣,因此我们使用 `<` 和 `>` 字符来将结果限制为单个单词,即 `(<[ADFJMNOS]*>)`;
- 星号 `*` 代表任意字符串,会返回单词中的全部文本;
- 小于和大于符号 `< >` 分别标记了每个单词的开始和结束,它们确保搜索会返回单个单词;
- 第四部分为年。我们使用相同的数字范围,但这次我们将计数限制为四个字符 `([0-9]{4})`。

在第二个表达式 `\2, \1` 中:

- 斜杠 `\` 与数字放在一起充当占位符;
- 第一个占位符后的逗号在两个被转置的姓名之间插入想添加的标点符号;
- 该表达式的含义是,写入第二个单词,添加逗号,写入第一个单词。



## 3. 批量换行

本节介绍了如何使用正则表达式将 "题号" 替换成 "题号、+换行" 和将选项 "B." 替换成 "换行符+B."

### 3.1 题号后加换行符

第一步,启动 Word,打开一个新的空白文档。复制此文字,将它粘贴到该文档中。

5、风险管理的主体是( )
A、法人 B、个人 C、任何组织和个人 D、组织
6、风险管理效益的大小,取决于( )
A、是否能以最小风险成本取得最大安全保障 B、是否能以最小风险成本取得最小安全保障 C、是否能以最大风险成本取得最小安全保障 D、是否能以最大风险成本取得最大安全保障
7、风险管理的方法分为( )
A、控制型和财务型 B、自留型和转移型 C、控制型和转移型 D、自留型和控制型
8、利用签订销售、建筑、运输合同处理风险的风险管理方法是( )
A、财务型保险转移风险 B、财务型非保险转移风险 C、避免型风险管理 D、控制型风险管理


第二步,按照上文描述打开「查找和替换」对话框,并选中「使用通配符」复选框。

第三步,在「查找内容」框中键入 `(<[0-9]{1,2}>、)`。

第四步,在「替换为」框中,键入 `\1^p`。注:确保在每个字符集之间插入空格。

第五步,单击「全部替换」。

![img](https://fig-lianxh.oss-cn-shenzhen.aliyuncs.com/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%92%8C%E9%80%9A%E9%85%8D%E7%AC%A6%E5%BF%AB%E9%80%9F%E6%9B%BF%E6%8D%A2_%E6%9D%8E%E5%B2%B8%E7%91%B6_Fig03.png)

关于正则表达式,在第一个表达式 `(<[0-9]{1,2}>、)` 中:

- 小于和大于符号 `< >` 分别标记了每个单词的开始和结束;
- `[0-9]` 代表匹配从 0 到 9 的数字;
- `{1,2}` 代表数字有 1 到 2 位。如果是 `{1,7}`,就是数字有 1 到 7 位;
- 顿号 `、` 则就代表字符串 "、"。

在第二个表达式 `\1^p` 中:

- `\1` 代表第一个变量;
- `^p` 代表段落标记符号。

### 3.2 选项前加换行符

第一步,按照上文描述打开「查找和替换」对话框,并选中「使用通配符」复选框。

第二步,在「查找内容」框中键入 `(<[BCD]{1,1}>)`。

第三步,在「替换为」框中,键入 `^p\1`。注:确保在每个字符集之间插入空格。

第四步,单击「全部替换」。

![img](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/2022/10/31/M6LzD4.png)

## word手动目录添加点点

## 手动目录制作

![](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/EGATLv_20221101192832.png)

1. ctrl选中所有2级目录,然后通过标尺上的「左缩进」按钮,来将我们的2级目录缩进一下。
2. 手动添加页码,给每一章和节标题后面添加上页码数。 **当然,这里你可以为你的页码添加括弧,或更多个性化内容**。

![](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/54SLTD_20221101193048.png)

3. 在每一章节标题与页码之间,按一下「Tab」键。

![](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/HlHA9m_20221101193120.png)

4. 选中所有的目录内容,然后点击「开始」-「段落」-「段落设置」-「制表位」,在「制表位位置」中设置成“42”,这里大家可以查看自己页面中“标尺”来设定具体位置。「对齐方式」设为“居中”。最后,我们选择一种「前导符」,再点击“设置”按钮,确定即可。

![](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/KzDzXg_20221101193251.png)
l