使用 Sed 和 Regex 替换字符串

29

我正在尝试使用sed和正则表达式(例如:[0-9]{1,5})取消注释文件内容。

# one two 12
# three four 34
# five six 56

以下工作正常:
sed -e 's/# one two 12/one two 12/g' /file

然而,我想要使用正则表达式模式替换所有匹配项,但不输入数字并保留结果中的数字。

1
你如何定义“匹配”?你想取消注释哪些行,你如何决定呢? - Lee Meador
只取消注释包含数字的文本。 - tangi
这是一个老问题,但它帮助我理解了sed。我对最高分答案做出了重大改变(在审核中进行编辑),并请求@starryknight64进行审核并选择一个答案。 - dank8
@dank8我无法选择答案,因为我不是这个问题的作者,我只是为了格式而编辑了它。但tangi是作者。 - starryknight64
@starryknight64 对不起,我的错。 - dank8
这是一个老问题。但它帮助我理解了sed。我对最高分答案进行了重大更改(在审核中进行编辑),并请@tangi审查并选择一个答案。 - dank8
6个回答

28

为了符合样例问题,只需

sed 's/^# //' file

如果只需要删除包含特定正则表达式的某些行的注释,则可以使用条件address

sed '/regex/s/^# //' file

所以每一行包含regex的内容都会被取消注释(如果该行以#开头)。

...其中regex可以是[0-9],例如:

sed '/[0-9]/s/^# //' file

将在每一行开头包含数字的行中删除#

sed '/[0-9]/s/^# \?//' file

使第一个空格不必须#one two 12,甚至更简洁

sed '/[0-9]$/s/^# //' file

将删除以数字作为最后一个字符的行开头的# 。然后

sed '/12$/s/^# //' file

将删除以12结尾的行开头的#。 或者

sed '/\b\(two\|three\)\b/s/^# //' file

将删除包含单词twothree的行开头的#符号。


2
我喜欢这个; 它更清晰地表达了意图。(你不想用"一些东西+数字+其他东西替换#,而是想在包含数字的行上删除#。) 对于regex,你可以使用[0-9]来仅影响带有数字的行,或者使用[0-9]$如果数字必须位于末尾。 - cHao

9
sed -e 's/^#\s*\(.*[0-9].*\)$/\1/g' filename

应该这样做。

问题在于这将取消注释所有内容,包括没有数字的文本。 - tangi
可以编写如下命令:sed -e '/[0-9]/s/^# *//' filename,详见我的回答 - F. Hauri - Give Up GitHub
不要忘记添加“-i”以直接在文件中替换,但如果没有这个选项,只是检查输出。 - Seraf

1

如果您只想取消注释包含数字的行,可以使用以下方法:

sed -e 's/^#\s*\(.*[0-9]+.*\)/\1/g' file

1

在相应的文件中,替换时是否需要使用-i选项?我可以通过以下方式删除前导#

sed -i "s/^# \(.*\)/\1/g" file

为了取消仅以至少一个数字序列结尾的已注释行的注释,我会像这样使用它:
sed -i "s/^# \(.*[[:digit:]]\+$\)/\1/g" file

这个解决方案要求注释行以一个空格字符(紧跟在#后面)开头,但如果不适用,那应该很容易调整。


0
以下的 sed 命令将会取消注释包含数字的行:
sed 's/^#\s*\(.*[0-9]\+.*$\)/\1/g' file

-1

我找到了。谢谢大家。

echo "# one two 12" | grep "[0-9]" | sed 's/# //g'

或者

cat file | grep "[0-9]" | sed 's/# //g'

这些解决方案会删除不包含数字但未被取消注释的行。也许没有这样的行(甚至没有空行吗?),但这可能并不完全适当。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接