如何使用第一个字符串替换第二个字符串

时间:2013-10-01 14:02:43

标签: string bash shell

我正在尝试用参数2替换第二个字符串。

脚本接受2个参数,然后脚本应该检查文件中是否存在第一个参数,如果存在,它应该检查它存在哪一行,它应该只替换该文件中的第二个字符串。

对于ex:在运行时我传递了2个参数1和2

./run.sh 1 2

脚本应该检查参数1是否存在,否则它应该将参数写入文件......现在正在发生..

现在如果我将参数1 3传递给脚本

脚本应搜索参数1所在的位置并将第二个字符串替换为2,即3 ..

我该怎么做?

这是我试过的

#!/bin/sh
#
FILE_PATH=/home/user/Desktop/script
FILE_NAME=$FILE_PATH/new.txt

echo $1
echo $2

param1=`cat $FILE_NAME | grep $1
if [ -z "$param1" ]
then
echo $1:$2 >> $FILE_NAME
else
param2=`cat $FILE_NAME | grep $1`
fi

我所指的文件会有这样的文字

+abc.3434.res:192.168.2.34:5400
+efg.3123.co3:192.168.2.24:5440
+klm.gsdg.cm5:192.168.2.64:5403

如果我将参数1作为abc.3434.res传递,参数2作为156.666.554.778传递 该脚本应该替换

+abc.3434.res:192.168.2.34:5400 with
+abc.3434.res:156.666.554.778:5400

3 个答案:

答案 0 :(得分:1)

这将查找您描述的格式的所有行,并且第一个参数匹配,并用第二个参数替换中间位。

sed -i -e "s/\(+$1:\).*\(:.*\)/\1$2\2/" $FILENAME

答案 1 :(得分:0)

您可以使用Awk:

awk -v f1="+$1" -v f2="$2" -F: '$1==f1 { $2=v2; s=1 }
    1
    END { if (!s) print f1 ":" f2 }' "$FILE_NAME"

由于Awk无法直接访问shell的变量,因此我们使用-v传递值。找到第一个字段时,第一个条件匹配;然后第二个字段被更改,s被设置为1,作为向我们自己发出替换信号的信号。下一行是无条件的,只需打印所有行。如果未找到匹配项,则在文件末尾添加新数据(s为零)。

答案 2 :(得分:-1)

使用以下格式:

sed s/olsstring/newstring/g 

如:

cat /etc/passwd |sed s/root/jeff/g 

但是如果你想立即存储到文件,你应该使用-i

sed -i s/olsstring/newstring/g yourfile

但是grep和另一个命令:

shell有一个变量$?,它打印return status 如果要调用grep命令,则应使用:

grep -i blahblah |egrep -v egrep 
if [$0 == 0 ];then 
 echo SUCCESS
fi;