我在匹配字符串时遇到问题,即使它们以任意数量的空格开头。自从我开始使用正则表达式以来已经很短时间了,所以我需要一些帮助
这是一个例子。我有一个包含两行的文件(file.txt)
#String1='Test One'
String1='Test Two'
我试图更改第二行的值,而不影响第 1 行,所以我使用了这个
sed -i "s|String1=.*$|String1='Test Three'|g"
这会更改两条线的值。如何让 sed 仅更改第二个字符串的值?
谢谢你
使用 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*
移到括号之外。
您可以使用几种解决方案来解决您的问题
如果您想忽略以注释字符(例如“#”)开头的行,您可以使用如下内容:
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
使用 GNU sed,尝试:
sed -i "s|^\s*String1=.*$|String1='Test Three'|" file
或
sed -i "/^\s*String1=/s/=.*/='Test Three'/" file
sed -i '/^String1/ s|String1=.*|String1='\''Test Three'\''|g' file.txt
使用
awk
你可以这样做:
awk '/String1/ && f++ {$2="Test Three"}1' FS=\' OFS=\' file
#String1='Test One'
String1='Test Three'
它将忽略
string1
的第一次点击,因为 f
不正确。