2013-02-01 43 views
8

我有一个需求,我需要更改文件的内容,比如xyz.cfg。该文件包含如下值:通过shell脚本更改文件的内容

group address=127.8.8.8 
port=7845 
Jboss username=xyz_ITR3 

我想在需要时通过shell脚本更改此内容并保存该文件。更改的内容可以像:

group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

我怎么能实现通过利用用户输入或以其它方式使用这个shell脚本?

+0

你应该问一个具体问题的一个特殊问题。由于Stack Overflow隐藏了你的密切原因:*“有些问题要求我们推荐或查找书籍,工具,软件库,教程或其他非本地资源,因为它们倾向于吸引自以为是的答案和垃圾邮件,因此不适合Stack Overflow。 ,而是描述问题以及到目前为止解决问题所做的工作。“* – jww

回答

23

如何像:

#!/bin/bash 

addr=$1 
port=$2 
user=$3 

sed -i -e "s/\(address=\).*/\1$1/" \ 
-e "s/\(port=\).*/\1$2/" \ 
-e "s/\(username=\).*/\1$3/" xyz.cfg 

$1,$2$3是传递给脚本的参数。这样的文件保存为script.sh,并确保它可执行文件chmod +x script.sh那么你就可以运行它,如:

$ ./script.sh 127.8.7.7 7822 xyz_ITR4 

$ cat xyz.cfg 
group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

这给你的基本结构,但是你将要考虑输入验证等。

+1

这完美地根据我的需要!谢谢 – user2031888

7
sed -i 's/something/other/g' filename.txt 

将编辑就地FILENAME.TXT和改字“东西”到“其他”

我认为-i可能是一个GNU扩展,虽然,但如果是你,你还好吗可以通过查找,xargs的等

添加它,如果你想改变它在一个shell脚本,您可以在命令行参数,并通过数字引用它们,例如:$ 1

编辑:

根据我的评论,sudo_O的答案正是你想要的例子。我要补充的是,通常你会想要使用多个文件进行匹配,跨越子目录等,所以要了解find/xargs,并且可以将两者结合起来。说的改变子网一堆.cfg的文件一个简单的例子是:

find -name '*.cfg' -print0 | xargs -0 -I {} sed -ie 's/\(192.168\)\.1/\1\.7/' {} 

注意-print0/-0参数传递给查找/ xargs的(用空格的路径/文件名非常有用),以及你要逃避,因为壳的捕获支架(以须藤的例子相同)

+0

>以及其他几行我将在新文件中保持不变。那么如何将这个新的内容与旧的一起? – user2031888

+0

我正要添加一个sudo_O的例子,但他的答案是去的;匹配/捕捉你关心的“钥匙”,并让其他人保持不变 – herdingofthecats

8

*

#! /bin/sh 
file=xyz.cfg 
addr=$1 
port=$2 
username=$3 
sed -i 's/address=.*/address='$addr'/' $file 
sed -i 's/port=.*/port='$port'/' $file 
sed -i 's/username=.*/username='$username'/' $file 

*

我希望这将是一个更容易理解,适合初学者

+0

谢谢你,之前从未使用过sed,也不知道接受的答案是怎么回事 –