查找和替换一个给定的输入字符串,比如abc,并替换成另一个字符串,比如文件/tmp/file.txt中的XYZ,最简单的方法是什么?
我正在编写一个应用程序,并使用IronPython通过SSH执行命令-但我不太了解Unix,也不知道该寻找什么。
我听说Bash除了是一种命令行界面外,还可以是一种非常强大的脚本语言。所以,如果这是真的,我假设你可以执行这样的操作。
我可以用bash实现它吗?要实现我的目标,最简单的(一行)脚本是什么?
查找和替换一个给定的输入字符串,比如abc,并替换成另一个字符串,比如文件/tmp/file.txt中的XYZ,最简单的方法是什么?
我正在编写一个应用程序,并使用IronPython通过SSH执行命令-但我不太了解Unix,也不知道该寻找什么。
我听说Bash除了是一种命令行界面外,还可以是一种非常强大的脚本语言。所以,如果这是真的,我假设你可以执行这样的操作。
我可以用bash实现它吗?要实现我的目标,最简单的(一行)脚本是什么?
当前回答
要以非交互式方式编辑文件中的文本,需要就地文本编辑器,例如vim。
下面是一个简单的例子,如何从命令行使用它:
vim -esnc '%s/foo/bar/g|:wq' file.txt
这相当于ex editor的@slim answer,基本上是一样的。
这里有一些实际的例子。
在文件中用bar替换文本foo:
ex -s +%s/foo/bar/ge -cwq file.txt
删除多个文件的尾随空格:
ex +'bufdo!%s/\s\+$//e' -cxa *.txt
故障处理(终端卡死):
添加-V1参数以显示详细消息。 强制退出:-cwq!
参见:
如何非交互地编辑文件(例如在管道中)?在Vi SE
其他回答
要以非交互式方式编辑文件中的文本,需要就地文本编辑器,例如vim。
下面是一个简单的例子,如何从命令行使用它:
vim -esnc '%s/foo/bar/g|:wq' file.txt
这相当于ex editor的@slim answer,基本上是一样的。
这里有一些实际的例子。
在文件中用bar替换文本foo:
ex -s +%s/foo/bar/ge -cwq file.txt
删除多个文件的尾随空格:
ex +'bufdo!%s/\s\+$//e' -cxa *.txt
故障处理(终端卡死):
添加-V1参数以显示详细消息。 强制退出:-cwq!
参见:
如何非交互地编辑文件(例如在管道中)?在Vi SE
当我被这个绊倒时,我很惊讶……
“mysql-server”包中有一个replace命令,如果你已经安装了它,请尝试一下:
# replace string abc to XYZ in files
replace "abc" "XYZ" -- file.txt file2.txt file3.txt
# or pipe an echo to replace
echo "abcdef" |replace "abc" "XYZ"
关于这一点,请参阅man replace。
您也可以在bash脚本中使用python。我在这里的一些顶级答案上没有太大的成功,并且发现这个不需要循环就能工作:
#!/bin/bash
python
filetosearch = '/home/ubuntu/ip_table.txt'
texttoreplace = 'tcp443'
texttoinsert = 'udp1194'
s = open(filetosearch).read()
s = s.replace(texttoreplace, texttoinsert)
f = open(filetosearch, 'w')
f.write(s)
f.close()
quit()
你也可以使用ed命令进行文件内搜索和替换:
# delete all lines matching foobar
ed -s test.txt <<< $'g/foobar/d\nw'
参见“使用ed通过脚本编辑文件”。
可以使用rpl命令。例如,你想改变整个php项目的域名。
rpl -ivRpd -x'.php' 'old.domain.name' 'new.domain.name' ./path_to_your_project_folder/
这不是一个明确的bash的原因,但它是一个非常快速和有用的。:)