使用sed内部bash进行简单替换无效

时间:2016-08-13 20:32:53

标签: regex bash sed

为什么sed bash内的echo '[a](!)' | sed 's/[a](!)/[a]/' 无法正常替换?

[a](!)

它返回[a]而不是sed。但是,为什么只有three characters需要在echo '[a](!)' | sed 's/\[a\]\(!\)/[a]/' 替换字符串中进行转义?

如果我考虑到需要在正则表达式字符串中替换其他字符并尝试

的情况
import boto3
from moto import mock_sqs

@mock_sqs
def test_sqs():
    sqs = boto3.resource('sqs', 'us-east-1')
    queue = sqs.create_queue(QueueName='votes')

    queue.send_message(MessageBody=open('beer.txt').read())

    messages = queue.receive_messages()
    assert len(messages) == 1
    assert messages[0].body == 'tasty\n'

它仍然无效。

3 个答案:

答案 0 :(得分:3)

重点是正则表达式模式中的for (String line : customer) { if (line != null){ bw.write(line); bw.newLine(); } } 与形成括号表达式的方括号不匹配。转义第一个[a],将其解析为文字[符号,您的替代品将有效:

[

请参阅this demo

答案 1 :(得分:1)

sed默认使用BRE,可以通过转义单个ERE元字符或使用-E参数来启用ERE。 []是BRE元字符,()是ERE元字符。当你写道:

echo '[a](!)' | sed 's/\[a\]\(!\)/[a]/'

您将[] BRE元字符转换为文字,这很好,但是您将文字()转换为ERE元字符,这是坏。这就是你想要做的事情:

echo '[a](!)' | sed 's/\[a\](!)/[a]/'

您可能真的想要使用捕获组编写:

echo '[a](!)' | sed 's/\(\[a\]\)(!)/\1/'

避免在替换的两侧重复[a]。使用最后一个-E参数启用ERE:

echo '[a](!)' | sed -E 's/(\[a\])\(!\)/\1/'

阅读sed手册页和正则表达式教程。

答案 2 :(得分:-1)

man echo告诉命令echo显示一行文字。所以[(及其右括号只是文字。

如果您阅读man grep并输入/^\ *Character Classes and Bracket Expressions/^\ *Basic vs Extended Regular Expressions,则可以阅读区别。 sed和其他使用正则表达式的工具将其解释为字符类和括号表达式。

你可以试试这个

$ echo '[a](!)' | sed 's/(!)//'