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


13

我希望编写一个shell脚本,使我可以从命令中读取文件并编辑文件而无需人工干预(基于搜索一些文本并将其替换为其他文本)。

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

Answers:


10

那就是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'

#用“ 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

一些参考


7

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

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

例如,假设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

+1修补程序始终是中等到大量或复杂修改的直接方法。我不知道为什么有些人尝试使用正则表达式工具来做所有事情。
user.dz

+1比对正则表达式进行逆向工程更好,该正则表达式似乎将您想要的更改应用于要测试的文件...但是,当应用于该文件的其他实例时,有时会产生其他效果。
bigjosh

如果我要替换特定文本字符串的所有实例,即是否将所有“”替换为“ _”,将所有“减号”替换为“-”,将所有“ gb | <string_of_numbers> || ARO:”替换为“,是否有补丁程序有意义? ARO:”?谢谢。
乔什

1

如果要编辑文件,请使用文件编辑器,可以从脚本(例如exed)中使用基于命令的文件编辑器。


1

您正在寻找sed或awk。我发现sed更简单,awk更强大。

这是另一个问题的例子。

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

这表示:

  • 在文件中搜索 /usr/share/applications/defaults.list
  • 查找/重复 gedit.desktop
  • 用。。。来代替 yournew.desktop
  • 将更改应用到位 -i

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.