我希望编写一个 shell 脚本,通过该脚本我可以从命令中读取文件并编辑文件而无需人工干预(基于搜索一些文本并将其替换为另一个文本)。
我不需要为此使用任何文本编辑器...只需进行文本搜索(如使用 grep),然后用其他文本替换它并保存更改....
答案1
这就是sed
发挥作用的地方。sed
命令具有以下格式:
[pattern1][,pattern2][!] command [args]
它使用正则表达式,因此可能会有点困难。下面是取自第二个链接的一些基本示例:
# 在每一行中用“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”的行,将“foo”替换为“bar” sed'/baz/s/foo/bar/g' # 将“foo”替换为“bar”,除了包含“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
一些参考资料
答案2
回答很晚。不过,这可能会帮助其他有类似问题的人。
我建议创建并应用补丁。可以找到一个很好的例子 这里。
例如,假设 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
脚本:使用 .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
使脚本可执行(终端):
chmod +x patch_file.sh
运行脚本(终端):
./patch_file.sh # may require sudo access depending on the directory affected
答案3
答案4
根据你需要编辑的内容,如果你vi
熟悉ed
可能会有用。