bash–如何在单引号字符串中转义单引号?grep命令详解 stackoverflow/questions/1250079/how-to-escape-single-quotes-within-single-quoted-strings
让我们说,你有⼀个bash别名:
alias rxvt='urxvt'
⼯作正常。
然⽽:
alias rxvt='urxvt -fg '#111111' -bg '#111111''
不会⼯作,也不会:
alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''
所以,如果你有转义报价后,你最终会匹配字符串中的开始和结束报价?
alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
似乎不明显,虽然它将代表相同的字符串,如果你允许连接他们这样。
如果你真的想在最外层使⽤单引号,记住你可以粘合两种类型的引号。例:
alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
# ^^^^^ ^^^^^ ^^^^^ ^^^^
# 12345 12345 12345 1234
如何解释’“’”’被解释为只是:
>’End first quotation使⽤单引号。
>“使⽤双引号开始第⼆个引号。
>’引号字符。
>“结束第⼆个引号,使⽤双引号。
>’使⽤单引号开始第三个引号。
如果不在(1)和(2)之间或(4)和(5)之间放置任何空格,shell将把该字符串解释为⼀个长字。
Let's say, you have a Bash alias like:
alias rxvt='urxvt'
which works fine.
However:
alias rxvt='urxvt -fg '#111111' -bg '#111111''
won't work, and neither will:
alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''
So how do you end up matching up opening and closing quotes inside a string once you have escaped quotes?
alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
seems ungainly although it would represent the same string if you're allowed to concatenate them like that.
If you really want to use single quotes in the outermost layer, remember that you can glue both kinds of quotation. Example:
alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
# ^^^^^ ^^^^^ ^^^^^ ^^^^
# 12345 12345 12345 1234
Explanation of how '"'"' is interpreted as just ':
1. ' End first quotation which uses single quotes.
2. " Start second quotation, using double-quotes.
3. ' Quoted character.
4. " End second quotation, using double-quotes.
5. ' Start third quotation, using single quotes.
If you do not place any whitespaces between (1) and (2), or between (4) and (5), the shell will interpret that string as a one long word.
$ echo'ni'string'hao'
nistringhao
$ echo'ni''string''hao'
nistringhao
$ echo'ni'''string'''hao'
nistringhao
$ echo'ni'"'"'string'"'"'hao' # ok!
ni'string'hao
$ echo"ni'"'"'"string'hao" #ok 2!
ni'"string'hao
bash中的转义
转义是引⽤单字符的⽅法.在单个字符前⾯的转义符(\ 倒斜杠)告诉shell不必特殊解释这个字符,只把它当成字⾯上的意思.
但在⼀些命令和软件包⾥,⽐如说echo和sed,转义⼀个字符可能会引起⼀个相反的效果--因为它们可能触发那个字符的特殊意思.
---引⾃ abs
这个序列应该出现在不移动光标的字符序列(如颜⾊转义序列)之前.它使bash能够正确计算⾃动换⾏.这个序列应该出现在不移动光标的字符序列(如颜⾊转义序列)之前.它使bash能够正确计算⾃动换⾏.
这个序列应该出现在⾮打印字符序列之后. (
\e[32;47m\e[32;47m
)
(⽆为注: 当然, 你也可以⽤命令替换来显⽰时间⽇期: PS1="$(date +%x-%X)")
( 以下内容来⾃ man console_codes 的结果, 翻译有修改, 并删除部分⽆法在⼩机使⽤的序列. ) ESC 转义序列:
c 重置终端.
D 换页(纵向制表符).
E 换⾏.
H 设置当前列为制表位. (未验证)
M 翻转换⾏, 向上换页(Reverse linefeed).
7 存储当前状态(光标坐标, 属性).
8 恢复上⼀次储存的设置
[ (见下)
#8 屏幕校准测试 - 以E填充屏幕.
例: printf "\e#8"
ESC[ 转义序列:
A 光标上移指定⾏.
B 光标下移指定⾏.
C 光标右移指定列. \e[3C 右移3列
D 光标左移指定列.
G 光标移动到当前⾏的指定列.
H 光标移动到指定⾏和列(⾏列起始计数为1, tput cup 的起始计数为0).
\e[y;xH y=3; x=5 第三⾏第五列.
J 删除内容(默认从当前光标处到结尾).
\e[1J: 删除从开始到光标处的内容.
\e[2J: 清空整个屏幕.
K 删除⾏(默认从当前光标处到⾏尾).
\e[1K: 删除从⾏⾸到当前光标处的内容.
\e[2K: 删除整⾏.
d 光标移动到当前列指定⾏
f 同\H.
h 设置模式(见下).
l 重置模式(见下).
m 设置属性(见下).
n 状态报告(见下).
r 设置滚动范围; 参数为⾸⾏和末⾏.(好像不能⽤...)
s 存储光标位置.
u 恢复光标位置.
设置图形属性:
\e[ <;属性数值> m 设置显⽰属性. 同样的序列可以设置⼀个或多个属性, 以 ";" 分开.
特效代码:
0 清除所有属性
1 ⾼亮(并加粗, 可惜⼩机没有加粗)
2 暗⾊(以⼀般亮度显⽰, ⼩机不⽀持)
4 下划线
5 闪烁(⼩机闪烁频率太低, ⽆⽤)
7 反显.
8 消隐(⼀段字不显⽰, ⼩机不⽀持)
22 正常亮度
24 关闭下划线
25 不闪烁
27 不反显
颜⾊代码前缀:
3: 前景 9: 加亮前景
4: 背景 10: 加亮背景
颜⾊代码后缀(加亮效果):
0 ⿊(深灰)
1 红(亮红)
2 绿(亮绿)
3 棕(黄⾊)
4 蓝(浅蓝)
5 紫(淡紫)(这个看不出来)
6 青(亮青)
7 浅灰(⽩)
9 默认颜⾊(限3,4前缀)
⽰例: 绿⾊前景, 亮青背景, 下划线. 0表⽰清除之前设置的所有属性.
\e[0;32;106;4m
打印⼀段内容后, 不要下划线了grep命令有什么用
\e[24m
⼜想反显了(就是绿⾊背景, 亮青前景)
\e[7m
那么, 怎么除去反显呢?
状态报告:
\e[5n
设备状态报告(DSR): 以\e[0n 应答(终端准备好).
\e[6n
光标位置报告(CPR): 以\e[y;xR 应答, 这⾥ x,y 指光标位置.
设置模式( ⽤l替换最后⼀个h就是重置模式 )
\e[?5h 全屏反显.
\e[?25h 显⽰终端光标
grep命令详解
grep命令是⽂本搜索命令,它可以正则表达式搜索⽂本,也可从⼀个⽂件中的内容作为搜索关键字。
grep的⼯作⽅式是这样的,它在⼀个或多个⽂件中搜索字符串模板。如果模板包括空格,则必须被引⽤,模板后的所有字符串被看作⽂件名。搜索的结果被送到标准输出,不影响原⽂件内容。
语法:
grep [option] pattern file
参数:
⽤于过滤/搜索的特定字符。可使⽤正则表达式能多种命令配合使⽤,使⽤上⼗分灵活。
-a --text #不要忽略⼆进制的数据。
-A<;显⽰⾏数> --after-context=<;显⽰⾏数> #除了显⽰符合范本样式的那⼀列之外,并显⽰该⾏之后的内容。
-b --byte-offset #在显⽰符合样式的那⼀⾏之前,标⽰出该⾏第⼀个字符的编号。
-B<;显⽰⾏数> --before-context=<;显⽰⾏数> #除了显⽰符合样式的那⼀⾏之外,并显⽰该⾏之前
的内容。
-c --count #计算符合样式的列数。
-C<;显⽰⾏数> --context=<;显⽰⾏数>或-<;显⽰⾏数> #除了显⽰符合样式的那⼀⾏之外,并显⽰该⾏之前后的内容。
-d <;动作> --directories=<;动作> #当指定要查的是⽬录⽽⾮⽂件时,必须使⽤这项参数,否则grep指令将回报信息并停⽌动作。
-e<;范本样式> --regexp=<;范本样式> #指定字符串做为查⽂件内容的样式。
-E --extended-regexp #将样式为延伸的普通表⽰法来使⽤。
-f<;规则⽂件> --file=<;规则⽂件> #指定规则⽂件,其内容含有⼀个或多个规则样式,让grep查符合规则条件的⽂件内容,格式为每⾏⼀个规则样式。-F --fixed-regexp #将样式视为固定字符串的列表。
-G --basic-regexp #将样式视为普通的表⽰法来使⽤。
-h --no-filename #在显⽰符合样式的那⼀⾏之前,不标⽰该⾏所属的⽂件名称。
-H --with-filename #在显⽰符合样式的那⼀⾏之前,表⽰该⾏所属的⽂件名称。
-i --ignore-case #忽略字符⼤⼩写的差别。
-l --file-with-matches #列出⽂件内容符合指定的样式的⽂件名称。
-L --files-without-match #列出⽂件内容不符合指定的样式的⽂件名称。
-n --line-number #在显⽰符合样式的那⼀⾏之前,标⽰出该⾏的列数编号。
-q --quiet或--silent #不显⽰任何信息。
-r --recursive #此参数的效果和指定“-d recurse”参数相同。
-s --no-messages #不显⽰错误信息。
-v --revert-match #显⽰不包含匹配⽂本的所有⾏。
-V --version #显⽰版本信息。
-w --word-regexp #只显⽰全字符合的列。
-
x --line-regexp #只显⽰全列符合的列。
-y #此参数的效果和指定“-i”参数相同。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论