为什么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'
它仍然无效。
答案 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/(!)//'