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

问题描述 投票:0回答:5

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

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

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

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

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

这会更改两条线的值。如何让 sed 仅更改第二个字符串的值?

谢谢你

sed spaces substitution
5个回答
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*
移到括号之外。


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

0
投票

使用 GNU sed,尝试:

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

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

0
投票
sed -i '/^String1/ s|String1=.*|String1='\''Test Three'\''|g' file.txt

-1
投票

使用

awk
你可以这样做:

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

它将忽略

string1
的第一次点击,因为
f
不正确。

© www.soinside.com 2019 - 2024. All rights reserved.