-1

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

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

例如:在运行时我传递了 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
4

3 回答 3

1

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

sed -i -e "s/\(+$1:\).*\(:.*\)/\1$2\2/" $FILENAME
于 2013-10-01T20:00:13.230 回答
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 的变量,所以我们将值传入 with -v。当找到第一个字段时,第一个条件匹配;然后第二个字段被更改,并s设置为 1 作为向我们自己发出替换已经发生的信号。下一行是无条件的,只是打印所有行。在文件末尾,如果未找到匹配项(s为零),我们将添加新数据。

于 2013-10-01T19:50:51.033 回答
-1

使用以下格式:

sed s/olsstring/newstring/g 

如 :

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

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

sed -i s/olsstring/newstring/g yourfile

但是 grep 和另一个命令:

shell 有一个变量, 如果你想调用 grep 命令,$?它会打印出来,你应该使用:return status

grep -i blahblah |egrep -v egrep 
if [$0 == 0 ];then 
 echo SUCCESS
fi;
于 2013-10-01T14:09:24.720 回答