Chr*_*ian 40 linux bash command-line special-characters
我自己写了一个program需要正则表达式作为输入的 linux 程序。
我想在bashshell 中调用程序并将该正则表达式作为命令行参数传递给程序(还有其他命令行参数)。一个典型的正则表达式看起来像
[abc]\_[x|y]
Run Code Online (Sandbox Code Playgroud)
不幸的是,字符[,]和|是bash. 因此,调用
program [abc]\_[x|y] anotheragument
Run Code Online (Sandbox Code Playgroud)
不起作用。有没有办法通过使用某种转义字符或引号等来传递表达式?
(调用program "[abc]\_[x|y] anotheragument"也不起作用,因为它将两个参数解释为一个。)
ant*_*ris 33
您可以:
\[abc\]_\[x\|y\])或"[abc]_[x|y]")。编辑:正如有些人指出的那样,双引号不会阻止变量扩展或命令替换。因此,如果您的正则表达式包含可以被 bash 解释为其中之一的内容,请改用单引号。
Fli*_*imm 31
使用单引号。单引号确保不解释任何字符。
$ printf %s 'spaces are not interpreted away
neither are new lines
nor variable names $TESTING
nor square brackets [TESTING]
nor pipe characters or redirection symbols | > <
nor the semicolon ;
nor backslashes \a \b \c \\
the only thing that does not work is the single quote itself
'
Run Code Online (Sandbox Code Playgroud)
如果您需要嵌入单引号,有两种解决方案:
$ printf '%s\n' '[ Don'"'"'t worry, be happy! ]'
[ Don't worry, be happy! ]
$ printf '%s\n' '[ Don'\''t worry, be happy! ]'
[ Don't worry, be happy! ]
Run Code Online (Sandbox Code Playgroud)
每 man bash
存在三种引用机制:转义字符、单引号和双引号。
未加引号的反斜杠 ( \ ) 是 转义字符。它保留了下一个字符的字面值,<newline> 除外。如果出现\ <newline> 对,并且反斜杠本身没有被引用,则\ <newline> 被视为行继续(即,它从输入流中删除并有效地被忽略)。
将字符括在单引号中会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。
双引号中的字符会保留引号内所有字符的字面值,但$、`、\除外,并且在启用历史扩展时,! . 字符$和`在双引号内保留其特殊含义。反斜杠仅在后跟以下字符之一时才保留其特殊含义:$、`、"、 \或<newline>。双引号可以通过在双引号内加上反斜杠来引用。如果启用,历史扩展将被执行,除非!出现在双引号中的是使用反斜杠进行转义。!前面的反斜杠!没有被移除。
特殊参数*和@在双引号中具有特殊含义(请参阅下面的参数)。
$' string '形式的单词被特殊处理。单词扩展为string,并按照 ANSI C 标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:
\一个 警报(钟形) \ b 退格 。\ E 。\ E 转义字符 \˚F 形式进料 \ n 新行 \ r 回车 \吨 水平制表 符\ v 垂直制表 \\ 反斜杠 \” 单引号 \” 双引号 \ NNN 的八位字符,其值为八进制值nnn (一到三位数) \x HH 其值为十六进制值的八位字符HH (一或两个十六进制数字) \u HHHH Unicode (ISO/IEC 10646) 字符,其值为 十六进制值HHHH(一到四个十六进制数字) \U HHHHHHHH Unicode (ISO/IEC 10646) 字符,其值为 十六进制值HHHHHHHH(一到八个十六进制数字) \c x 一个 control- x字符扩展结果是单引号的,就好像美元符号不存在一样。
以美元符号 ( $" string " )开头的双引号字符串将使该字符串根据当前语言环境进行翻译。如果当前语言环境是C或POSIX,则忽略美元符号。如果字符串被翻译和替换,则替换是双引号。
| 归档时间: |
|
| 查看次数: |
171415 次 |
| 最近记录: |