我遇到了匹配字符串的问题,即使它们以任意数量的空格开头。我开始使用正则表达式的时间很短,所以我需要一些帮助
这是一个例子。我有一个包含两行的文件(file.txt)
#String1='Test One'
String1='Test Two'
我试图更改第二行的值,而不影响第1行,所以我使用了这个
sed -i "s|String1=.*$|String1='Test Three'|g"
这会更改两行的值。如何才能使sed只更改第二个字符串的值?
谢谢
答案 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
的首次点击。