我正在尝试用参数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
答案 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;