如何仅使用终端以编程方式编辑文件?

Roh*_*sal 14 command-line editing text-processing

我希望编写一个 shell 脚本,通过它我可以从命令中读取文件并在没有手动干预的情况下编辑文件(基于搜索一些文本并将其替换为另一个)。

我不需要为此使用任何文本编辑器......只需进行文本搜索(如使用 grep),然后用其他文本替换它并保存更改......

Rin*_*ind 10

这就是sed发挥作用的地方。一个sed命令的格式如下:

[pattern1][,pattern2][!] command [args]
Run Code Online (Sandbox Code Playgroud)

它使用正则表达式,所以它可以/将会有点困难。从下面的第二个链接中获取的一些基本示例:

# 在每一行用“bar”替换(查找和替换)“foo”
sed 's/foo/bar/' # 只替换一行中的第一个实例
sed 's/foo/bar/4' # 只替换一行中的第 4 个实例
sed 's/foo/bar/g' # 替换一行中的所有实例
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个大小写
sed 's/\(.*\)foo/\1bar/' # 只替换最后一种情况

# 仅对包含“baz”的行用“bar”替换“foo”
sed '/baz/s/foo/bar/g'

# 用“bar”替换“foo”除了包含“baz”的行
sed '/baz/!s/foo/bar/g'

# 将“scarlet”或“ruby”或“puce”改为“red”
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # 大多数 sed
gsed 's/scarlet\|ruby\|puce/red/g' # 仅限 GNU sed

一些参考


小智 9

很晚的答案。但是,这可能会帮助其他有类似问题/问题的人。

我建议创建和应用补丁。一个很好的例子可以在这里找到 。

例如,假设 new.txt 文件包含要应用于 old.txt 的更改。您可以在终端上或通过创建和执行 patch_file.sh 来执行命令。

命令行:打开终端并复制并执行以下行(根据需要更改文件名):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch
Run Code Online (Sandbox Code Playgroud)

脚本:使用 .sh 文件方法。在终端中(键盘:ctrl+alt+t: gedit patch_file.sh

将终端上的命令复制并粘贴到 .sh 文件和标题下方,如下所示 (gedit)。

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch
Run Code Online (Sandbox Code Playgroud)

使脚本可执行(终端):

chmod +x patch_file.sh
Run Code Online (Sandbox Code Playgroud)

运行脚本(终端):

./patch_file.sh # may require sudo access depending on the directory affected
Run Code Online (Sandbox Code Playgroud)