Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
苏诺斯';在bash脚本中sed-replace模式:没有任何更改_Bash_Sed_Sunos - Fatal编程技术网

苏诺斯';在bash脚本中sed-replace模式:没有任何更改

苏诺斯';在bash脚本中sed-replace模式:没有任何更改,bash,sed,sunos,Bash,Sed,Sunos,答复: 如前所述,我的SED版本是BRE,不支持|(pipe)。因此,在我的情况下,可以使用以下内容: sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g" sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g" 与name=“and value=“匹配,但与其他=“and value=”不匹配。regex([namevlu])只包含我需要的字符。好的,它并不是尽可能的保存,但我不希望像

答复:

如前所述,我的SED版本是BRE,不支持|(pipe)。因此,在我的情况下,可以使用以下内容:

sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"
sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"
与name=“and value=“匹配,但与其他=“and value=”不匹配。regex([namevlu])只包含我需要的字符。好的,它并不是尽可能的保存,但我不希望像valuenm=“之类的东西存在。如果有人确切地需要指定的正则表达式,它需要创建两个(或更多)sed

原始问题:

我需要用另一个字符串替换一个字符串,但我确实需要检查特定的上下文

例如:

blah val1=“BASE.OLD_TEXT_或_SO”blabla
blah val2=“BASE.OLD_SOMETHING”

我想换成

blah val1=“BASE.NEW_TEXT_或_SO”blabla
blah val2=“BASE.NEW_SOMETHING”

此脚本不会更改任何内容:

#!/bin/bash

...

str1="OLD_"
str2="NEW_"

sed "s/\(name=\"|value=\"\)BASE\.$str1/\1BASE\.$str2/g" input.file > output.file
但后来类似的sed工作正常:

sed "s/\(<Tag>\)[A-Z0-9\-\._|]*\(<\/Tag>\)/\1$otherStr\2/g" input.file > output.file
regex在工作正常的地方进行了测试

(name="|value=")BASE\.OLD_
\1BASE\.NEW_
系统:
SunOS 5.11
GNUBash 4.1.11(1)-发布
Sed 4.2.1


提前感谢。

我不确定SunOS sed是否包括|。这将添加-r,我认为SunOS sed不支持-r

但在这种情况下,您应该能够:

sed "s/\(val[12]=\"\)BASE.$str1/\1BASE.$str2/"
如果您不能使用val[12],那么我认为它不能在sed中完成。但在perl中并不难:

perl -pe "if (/val1=BASE.$str1/ || /val2=BASE.$str1/) {s/BASE.$str1/BASE.$str2/;}"

我不确定SunOS sed是否包含|。它将添加-r,我认为SunOS sed不支持-r

但在这种情况下,您应该能够:

sed "s/\(val[12]=\"\)BASE.$str1/\1BASE.$str2/"
如果您不能使用val[12],那么我认为它不能在sed中完成。但在perl中并不难:

perl -pe "if (/val1=BASE.$str1/ || /val2=BASE.$str1/) {s/BASE.$str1/BASE.$str2/;}"
在中,并且替代(
|
)不存在。 您的正则表达式必须写为:

sed "s/\(val[12]=\"BASE\.\)${str1}/\1${str2}/g" input.file
如果您使用的sed版本支持,那么您可以使用:

sed -E "s/(val(1|2)=\"BASE\.)${str1}/\1${str2}/g" input.file
在中,并且替代(
|
)不存在。 您的正则表达式必须写为:

sed "s/\(val[12]=\"BASE\.\)${str1}/\1${str2}/g" input.file
如果您使用的sed版本支持,那么您可以使用:

sed -E "s/(val(1|2)=\"BASE\.)${str1}/\1${str2}/g" input.file
如前所述,我的SED版本是BRE,不支持|(管道)。因此,在我的情况下,可以使用以下内容:

sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"
sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"
匹配name=“and value=“但不匹配other=“and values=“.regex([namevlu])的文件只包含我需要的字符。好吧,它并没有尽可能地保存,但我不希望存在类似valuenm=”之类的内容。如果某人需要准确地指定正则表达式,则需要创建两个(或更多)sed

如前所述,我的SED版本是BRE,不支持|(管道)。因此,在我的情况下,可以使用以下内容:

sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"
sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"

与name=“and value=“匹配,但与其他=“and value=”不匹配。regex([namevlu])只包含我需要的字符。好的,它并没有尽可能地保存,但我不希望存在类似valuenm=”之类的东西。如果有人确切地需要指定的正则表达式,它需要创建两个(或更多)sed。

str0有一个新行?正如你的问题一样?你能正确地更新变量吗?str0有新行,它只是用于控制台中的测试(echo str0 |…)…最初的数据取自输入文件。为什么不能直接替换文件中的模式?只需在脚本im中使用sed“s/(val1=\“| val2=\”)BASE\.$str1/\1BASE\.$str2/g”input.file>output.file,其中不是$str0。$str0仅用于在控制台中使用echo$str0 | sed“s/(val1)进行测试=\“| val2=\”)基\.$str1/\1BASE\.$str2/g”。。。主要问题在脚本中。str0并不重要。我以后编辑STR0有新行吗?就像你的问题一样?你能正确地更新变量吗?str0有换行符,它只是在控制台中测试(echo str0 |…)。。最初数据取自输入文件。为什么不能直接在文件中替换模式?只需在脚本im中使用sed“s/(val1=\“\124; val2=\”)BASE\.$str1/\1BASE\.$str2/g”input.file>output.file(其中不是$str0)提供要替换的文件中的部分$str0只是为了在控制台中使用echo$str0 | sed“s/(val1=\“| val2=\”)BASE\.$str1/\1BASE\.$str2/g“。。。主要问题在脚本中。str0并不重要。我想是的,但是,现在我不能测试它。关于val[12]:在真实脚本中,我使用name=“and Object=”单词。所以,如果你是对的,而sunOS没有|(管道),这将是我的下一个挑战:我害怕它。我想是的,但是,现在我无法测试它。关于val[12]:在真实脚本中,我使用name=“and Object=”单词。所以,如果你是对的,而sunOS没有(管道),这将是我面临的下一个挑战:我害怕那个。