RegExp 板


LINE

环境 mac osx 使用 sed filename内容 ----------------- I\ am\ John\ you\ are\ Mary I\\ am\\ John\\ you\\ are\\ Mary ----------------- 请问一下 我用 sed -i "" s/"I\\\ am\\\ John"/Oh/g filename ----------------- 与 sed -i "" s/"I\\\\\ am\\\\\ John"/Oh/g filename --------------------- 都能将第二行取代成 Oh\ you\ are\ Mary 第一行指令标色 sed -i "" s/"I\\\ am\\\ John"/Oh/g filename ----------------- 对应I\ am\ John\ you\ are\ Mary 这个我可以理解 第二行我原本是要拿来取代两个斜线的 I\\ am\\ John\\ you\\ are\\ Mary的 但是实际上测试要取代两个斜线的得下指令 sed -i "" s/"I\\\\\\\ am\\\\\\\ John"/Oh/g filename ------------------------ 想请教一下 "\\\\\ " 与 "\\\\\\\ " -------- ---------- 在这边是怎麽对应的呢 感谢大家 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.59.147.226 ※ 编辑: donkeychen 来自: 210.59.147.226 (03/24 15:47) ※ 编辑: donkeychen 来自: 210.59.147.226 (03/24 15:52)
1F:推 LPH66:基本上这些多余的 \ 都是给 shell 看的, regexp 并没有对 \ 03/24 16:55
2F:→ LPH66:有特殊的处理; 空白前面加 \ 也是为了告诉 shell "这个空白 03/24 16:56
3F:→ LPH66:是我的参数的一部份, 不是分隔参数用的" 03/24 16:56
4F:→ LPH66:regexp 里的 \ 只有在後面跟着一些特殊字元时 (如小括号) 03/24 16:57
5F:→ LPH66:才有用, 所以後者其实送给 sed 的是三个 \ 03/24 16:57
配合fjm31714大大说的我才看懂 感谢LPH66大大
6F:→ LPH66:就是为了要把第一个 \ 的这个意义 escape 掉 03/24 16:58
7F:→ LPH66:(以上是照印象啦, 没时间查说明书有错还请指正) 03/24 16:59
8F:→ donkeychen:喔喔 LPH66大的意思是 指令还先被shell拆一层 03/24 17:04
9F:→ donkeychen:哎呀我试到都眼花了 一直在那边数 PRINT出来 @.@; 03/24 17:05
10F:→ donkeychen:用 sed -i "" 's/\\\\/Oh/g' filename 就简单的取代两 03/24 17:17
11F:→ donkeychen:个\ 只是遇到要取代'的就又出现瓶颈>< 03/24 17:21
12F:→ donkeychen:如果要取代' 我是用 s/"\'"/Oh/g 03/24 17:22
13F:→ fjm31714:为什麽我看不太懂你的 sed 指令 Orz 好多 " 03/26 17:40
14F:→ fjm31714:字串会先被 shell 拆过没错,用其他语言也是这样 03/26 17:41
15F:→ fjm31714:像是 python 的 re module 有说明 http://goo.gl/2g6TRc 03/26 17:42
16F:→ fjm31714:我是写像这样@@ sed -i "s/I\\\ am\\\ John/Oh/" file 03/26 17:47
这边我补充一下 -i "" 是说直接取代档案 不产生备分档 如果原档名是 lalala.txt 取代时下指令 -i try regexp lalala.txt 会把还没改过的东西存到lalala.txttry里面 与正规表示无关 所以最前面的-i "" 没有mac的可以不用特别去管他 我把我原文正规的部分用红线标记 希望对阅读有帮助^^;
17F:→ fjm31714:然後你可以印出取代指令 echo "s/I\\\ am\\\ John/Oh/" 03/26 17:47
这边的结果是印出 s/I\\ am\\ John/Oh/ 我猜您的意思是说 因为整个指令会先被shell接收处理後才给sed程式 所以先把"正规表示式" 丢给echo 看shell如何处理"正规表示式" 这边看起来是\\ 被变成\了
18F:→ fjm31714:就知道 regex 长怎样 另外 "" 里的空白原本是不用 escape 03/26 17:49
19F:→ fjm31714:可是如果这样写 "s/I\\ am\\ John/Oh/" sed 拿到会变 03/26 17:50
20F:→ fjm31714:"s/I\ am\ John/Oh/" 在 regex 里 \ 用来逃脱东西如果没 03/26 17:51
21F:→ fjm31714:有这个逃脱他就会找原本那个字元这边就会是空白 03/26 17:51
如同大大说明的 我将问题在这边整理一下 原档案 ======================================================= I\ am\ John\ you\ are\ Mary I\\ am\\ John\\ you\\ are\\ Mary ======================================================= 以""包裹正规表示式 指令行1个\: sed -i "" s/"I\ am\ John"/Oh/g filename ------------- shell拆过给sed: I\ am\ John 对sed来说\ 没用 要比对的对象是: I am John 比对结果: no matched ======================================================= 指令行2个\: sed -i "" s/"I\\ am\\ John"/Oh/g filename --------------- shell拆过给sed: I\ am\ John 对sed来说\ 没用 要比对的对象是: I am John 比对结果: no matched ======================================================= 指令行3个\: sed -i "" s/"I\\\ am\\\ John"/Oh/g filename ----------------- shell拆过给sed: I\\ am\\ John 要比对的对象是: I\ am\ John 比对结果: line1 matched ======================================================= 指令行4个\: sed -i "" s/"I\\\\ am\\\\ John"/Oh/g filename ------------------- shell拆过给sed: I\\ am\\ John 要比对的对象是: I\ am\ John 比对结果: line1 matched ======================================================= 指令行5个\: sed -i "" s/"I\\\\\ am\\\\\ John"/Oh/g filename --------------------- shell拆过给sed: I\\\ am\\\ John 对sed来说\ 没用 要比对的对象是: I\ am\ John 比对结果: line1 matched ======================================================= 指令行6个\: sed -i "" s/"I\\\\\\ am\\\\\\ John"/Oh/g filename ----------------------- shell拆过给sed: I\\\ am\\\ John 对sed来说\ 没用 要比对的对象是: I\ am\ John 比对结果: line1 matched ======================================================= 指令行7个\: sed -i "" s/"I\\\\\\\ am\\\\\\\ John"/Oh/g filename ------------------------- shell拆过给sed: I\\\\ am\\\\ John 要比对的对象是: I\\ am\\ John 比对结果: line2 matched ======================================================= 指令行8个\: sed -i "" s/"I\\\\\\\\ am\\\\\\\\ John"/Oh/g filename --------------------------- shell拆过给sed: I\\\\ am\\\\ John 要比对的对象是: I\\ am\\ John 比对结果: line2 matched 整理上面的指令 发现shell会把两个\\ 拆成一个\ 然後单独的\後面接着东西也会被当作单独\来看 (如果单独的\後面没接东西 就会变成多行指令当作一行进入下一行等你输入) 於是在这个情况使用""包裹正规表示式 最正确的指令是 要比对内容一个\ 在指令行双引号内要有4个\ 所以我原本用5个\ 跟7个\ 都是歪打正着 应该是用4个\ 跟8个\ 此外如果用''来包裹正规表示式的情况如下 ======================================================= 指令行1个\: sed -i "" s/'I\ am\ John'/Oh/g filename ------------- shell拆过给sed: I\ am\ John 对sed来说\ 没用 要比对的对象是: I am John 比对结果: no matched ======================================================= 指令行2个\: sed -i "" s/'I\\ am\\ John'/Oh/g filename --------------- shell拆过给sed: I\\ am\\ John 要比对的对象是: I\ am\ John 比对结果: line1 matched ======================================================= 指令行3个\: sed -i "" s/'I\\\ am\\\ John'/Oh/g filename ----------------- shell拆过给sed: I\\\ am\\\ John 对sed来说\ 没用 要比对的对象是: I\ am\ John 比对结果: line1 matched ======================================================= 指令行4个\: sed -i "" s/'I\\\\ am\\\\ John'/Oh/g filename ------------------- shell拆过给sed: I\\\\ am\\\\ John 要比对的对象是: I\\ am\\ John 比对结果: line2 matched
22F:→ fjm31714:以上是我的看法,有错请指教 >< 03/26 17:52
感谢大大 您说的用echo来看解决我的疑惑 包括了" 与 ' 的问题 处理 " echo "\"" echo '"' 均可 处理 ' echo "'" 才可以 ※ 编辑: donkeychen (210.59.147.226), 04/14/2014 11:00:38







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP