匹配字符串,即使它们在SED中以空格开头

时间:2014-04-28 19:41:20

标签: sed spaces substitution

我遇到了匹配字符串的问题,即使它们以任意数量的空格开头。我开始使用正则表达式的时间很短,所以我需要一些帮助

这是一个例子。我有一个包含两行的文件(file.txt)

#String1='Test One'
String1='Test Two'

我试图更改第二行的值,而不影响第1行,所以我使用了这个

sed -i "s|String1=.*$|String1='Test Three'|g"

这会更改两行的值。如何才能使sed只更改第二个字符串的值?

谢谢

4 个答案:

答案 0 :(得分:1)

使用gnu sed,使用\s匹配空格,而其他sed实现通常使用[[:space:]]字符类。所以,选择其中一个:

sed 's/^\s*AWord/AnotherWord/'
sed 's/^[[:space:]]*AWord/AnotherWord/'

由于你使用的是-i,我假设是GNU sed。无论哪种方式,你可能不应该重新输入你的单词,因为这会引入拼写错误的机会。我会选择:

sed -i "s/^\(\s*String1=\).*/\1'New Value'/" file

如果您不想保留前导空格,请将\s*移到parens之外。

答案 1 :(得分:0)

使用GNU sed,尝试:

sed -i "s|^\s*String1=.*$|String1='Test Three'|" file

sed -i "/^\s*String1=/s/=.*/='Test Three'/" file

答案 2 :(得分:0)

您可以使用几种解决方案来解决您的问题

如果您想忽略以评论字符开头的行,例如'#'你可以使用这样的东西:

sed -i "/^\s*#/! s|String1=.*$|String1='Test Three'|g" file.txt

仅对与正则表达式/.../!不匹配的行进行操作,该正则表达式以^开头,可选的空格\s*后跟一个octothorp #

另一种选择是在' String'之前加入字符。作为替代的一部分。这样做意味着您需要捕获\(...\)群组,并将其包含在\1

的输出中
sed -i "s|^\(\s*\)String1=.*$|\1String1='Test Four'|g" file.txt

答案 3 :(得分:-1)

使用awk即可:

awk '/String1/ && f++ {$2="Test Three"}1' FS=\' OFS=\' file
#String1='Test One'
String1='Test Three'

由于string1不正确,它会忽略f的首次点击。