我的文件名为temp.txt
,内容为
ANSWER "1234:IDGK"
ANSWER "123456:DEF"
我需要使用脚本中的输入参数更改答案" 1234: $ 1 "
现在,我在脚本(run.sh
)中使用以下代码更改temp.txt
#!/bin/bash
Prompt1=$1
sed -i -e "s/\(1234:\).*/\1$1/" temp.txt
但是,当我使用任何输入值运行脚本时{无论值的长度} {strong> "
都覆盖在temp.txt
中。
例如
./run.sh ABCDEF
temp.txt更新为
ANSWER "1234:ABCDEF
ANSWER "123456:DEF"
预期输出
ANSWER "1234:ABCDEF"
ANSWER "123456:DEF"
注意:文件中的输入值将始终不相同,因此我无法使用
sed s/IDGK/ABCDEF/g
请建议正确的SED命令,该命令将替换唯一的文字,而不是 "
。
答案 0 :(得分:1)
由于您不希望删除尾随双引号,因此您需要将其从替换中排除。例如:
sed -i -e "s/\(1234:\).*\(.\)/\1$1\2/" temp.txt
第二次捕获匹配该行的最后一个字符,即双引号。
或者:
sed -i -e 's/\(1234:\)[^"]*'"/\1$1/" temp.txt
不匹配任何字符,只匹配不是双引号的字符。请注意使用单引号和双引号来确保否定字符类中的双引号是双引号。或者再次:
sed -i -e "s/\(1234:\)[^\"]*/\1$1/" temp.txt
这会以反斜杠转义双引号。这不是我做的方式,但它会正常工作。
答案 1 :(得分:0)
你可以试试这个。
sed -i -e 's/\(1234:\).*/\1'$1'"/' temp.txt
最后一个字符是双引号。所以你可以直接把它放在替换中。或者你可以试试这个。
sed -i -e 's/\(1234:\)[^"]*/\1'$1'/' temp.txt
如果您的系统不允许使用-i
选项,则可以使用此类重定向。
sed -e 's/\(1234:\)[^"]*/\1'$1'/' temp.txt > temp.txt