Linux中的SED命令用脚本编辑文件

时间:2015-01-29 01:00:15

标签: regex linux bash shell sed

我的文件名为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命令,该命令将替换唯一的文字,而不是 "

2 个答案:

答案 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