Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed-用字符替换方括号?_Bash_Sed - Fatal编程技术网

Bash sed-用字符替换方括号?

Bash sed-用字符替换方括号?,bash,sed,Bash,Sed,我有一个字符串,用括号括住一个字符,如下所示: [a] 我想将括号内的字符替换为字符,因此最终结果如下所示: aaa 这是我想到的,但它不起作用: sed 's/\[ \([a-z]\) \]/\2/g' < testfile sed's/\[\([a-z]\)\]/\2/g'

我有一个字符串,用括号括住一个字符,如下所示:

[a]
我想将括号内的字符替换为字符,因此最终结果如下所示:

aaa
这是我想到的,但它不起作用:

sed 's/\[ \([a-z]\) \]/\2/g' < testfile
sed's/\[\([a-z]\)\]/\2/g'

有人能帮我解释一下为什么我的命令不起作用吗?

我想你遗漏了一些基本概念。首先,让我们复制一个字符

$ echo a | sed -r 's/(.)/\1\1/' 
aa
括号表示组,
\1
表示第一个组

现在,匹配方括号中的字符并将其三倍

$ echo [a]b | sed -r 's/\[(.)\]/\1\1\1/'
aaab

您需要转义方括号字符,因为它们在正则表达式中有特殊意义。关键是你必须用括号括起你感兴趣的正则表达式,并用
\{number}
符号以相同的顺序引用它们。

你的父亲的问题
sed的/\[\([a-z]\])\]/\2/g'

1) The pattern has only one group \([a-z]\), so \2 is invalid;
2) The pattern contains space, there is no match found;
3) To replace brackets, you need to capture them in a group.
我的想法是,捕获模式中的所有组,并将它们替换为
\2\2\2

echo "[a]" | sed 's/\(\[\)\([a-z]\)\(\]\)/\2\2\2/g'

输出为:

aaa

请尝试以下代码:

$ echo "[a]" | sed 's/\[\([a-zA-Z]\)\]/\1\1\1/g'

输出:

aaa

图案中的空格是用来做什么的?
\2
应该是哪个捕获(来自模式)?您将用一个字符替换五个字符。这就是你的意思吗?去掉空格并将
\1
三倍,即:
sed's/\[\([a-z]\)\]/\1\1\1/g'
sed-e's/\[\(.\)\]/\1\1/g'
$ echo "[a]" | sed -r 's/\[([a-zA-Z])\]/\1\1\1/g'
aaa