sed命令 linux下的超强查找和替换命令
在维护magento的数据库 由于想修改部分数据 但是面对几百M的sql文件 没有好的工具是不行的 把他下载到本地拿editplus编辑进行查找替换不行 会因为文件太大会出错, 这时sed就能解决这个问题
?? sed是一个非常强大与实用的工具,在这里,我们只用到sed很有限的功能。如果你觉得这些非常有趣,我强烈推荐你阅读关于sed更多的功能,比如说man page。
我们将要用下面这个语法来在一个文件中查找并替换字符串
# sed -i ’s/[orginal_text]/[new_text]/’ filename.txt
比如你有一个叫做database.txt文件,里面大量的存放了的数据库服务器IP地址。现在你刚刚更换了数据库服务器,需要更新这个文件里面的IP地址。旧IP地址是202.97.1.16,新的IP是202.97.1.22。你只需要按下面简单的几个步骤:
# cat database.txt
LOCAL_DATABASE = 202.97.1.16
LOCAL_DIR = /home/calvin/
PROD_DB = 202.97.1.16
# sed -i ’s/202.97.1.16/202.97.1.22/g’ database.txt
# cat database.txt
LOCAL_DATABASE = 202.97.1.22
LOCAL_DIR = /home/calvin/
PROD_DB = 202.97.1.22
现在你可以打开database.txt这个文件,检查旧IP是不是被新IP所代替了。现在给大家解释一下上面这个命令。sed就是我们调用的命令,后面的参数-i代表的是“代替”。下面,我们需要使用一点正则表达式,通常也叫做regex。引号里面的字母s代表“替换“,最后的字母g代表“全局 “。中间的就是一个表示替换规则的正则表达式。
你可以选择不加字母g,不过,这也就意味着你的替换不是全局的,事实上,它通常只会替换所配置内容的第一行。下面我们用一个实例来看看效果:
# cat database.txt
LOCAL_DATABASE = 202.97.1.16
LOCAL_DIR = /home/calvin/
PROD_DB = 202.97.1.16, 202.97.1.16
# sed -i ’s/202.97.1.16/202.97.1.22/’ database.txt
# cat database.txt
LOCAL_DATABASE = 202.97.1.22
LOCAL_DIR = /home/calvin/
PROD_DB = 202.97.1.22, 192.168.1.16
下面我们来点真正神奇的东西。现在,假设你想要更改不只一个文件中而是当然目录底下所有文件中的某些字符串。你需要将若干文本文件中的wine改为champagne。
# find . -maxdepth 1 -name “*.txt” -type f -exec sed -i ’s/wine/champagne/’ {} \
我们使用find命令,也就是“find . -maxdepth 1 -name “*.txt” -type f”这部分,来获取当前目录中所有的文本文件列表。而其中的“find . maxdepth 1”部分告诉计算机只查找当前目录,而且不查找子目录的内容。'-name “*.txt”’部分代表只查找以“.txt”为后缀名的文件。然后,“-type f”部分表示只查找普通文件,而不查找目录文件之类的特殊文件。最后,“-exce”部分,代表对查找到的结果执行后面的命令。在这里,也就是对查找到的结果执行“sed -i ’s/wine/champagne/’ {} \”这个命令。(其中{}代表的是查找到的结果)
如果担心进行了错误替换,可以在-i命令后带后缀进行备份,比如:
sed -i.bak 's/202.123.23.12/localhost/g' *.xml
但应注意:替换命令后只需要有g命令,不能再加p命令。可能上面的命令看起来有点复杂。但是,只有你一旦使用,你就会意识到它的确值得你记录下来并且使用。