免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2959 | 回复: 13
打印 上一主题 下一主题

[文本处理] 請問大師們如何用sed處理含特殊字元的變量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-23 19:15 |只看该作者 |倒序浏览
本帖最后由 goddesschi 于 2014-08-23 19:53 编辑

舉例文件test.txt裡面內容為

  1. /home/guest/rt/[test][autod]/Whitney Houston[HAPPY]
  2. 111
  3. 222
  4. 333
  5. 444

复制代码
如果我想把/home/guest/rt/[test][autod]/這個字串用sed取代空的方式刪除
請問我應該怎麼作

因為這個字串/home/guest/rt/[test][autod]/已經被bash shell定義為$1
所以說我只能針對$1來處理 test.txt這份文件

我嘗試用sed來取代
sed -i  's#'$1'##g' test.txt

應該是礙於有[字元所以說無法正常取代(我試過如果$1指向的是/home/guest/rt/就沒有問題了
請問是否有辦法用sed處理這種內藏特殊字元的變量
如果不行的話有沒有其他軟體awk...等能實現我的需求

謝謝指導<(_ _)>

论坛徽章:
0
2 [报告]
发表于 2014-08-23 20:58 |只看该作者
我先用最笨的方法來做了,給各位大師參考

dirWhere="/home/guest/rt/[test][autod]/"
fileName="Whitney Houston[HAPPY]"

tree "$dirWhere""$fileName" >> $saveWhere"$newFileName"/"$newFileName".tree.txt
sed -i '1d' $saveWhere"$newFileName"/"$newFileName".tree.txt
echo "$fileName" > $saveWhere"$newFileName"/"$newFileName".tree2.txt
awk '{print $0}' $saveWhere"$newFileName"/"$newFileName".tree.txt  >> $saveWhere"$newFileName"/"$newFileName".tree2.txt
awk '{print $0}' $saveWhere"$newFileName"/"$newFileName".tree2.txt >$saveWhere"$newFileName"/"$newFileName".tree.txt
rm $saveWhere"$newFileName"/"$newFileName".tree2.txt

笨歸笨,如果沒有更好的方法也只能這樣玩了,有更好的建議請不吝指教

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
3 [报告]
发表于 2014-08-23 21:43 |只看该作者
回复 1# goddesschi


    可以先把变量中的特殊字符转义,之后再用 sed 方法。

   也可以用awk字符串替换,不过这也要注意awk的字符串解释。

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2014-08-23 21:45 |只看该作者
回复 1# goddesschi
  1. sed -i 's#/home/guest/rt/\[test\]\[autod\]/##g' urfile
复制代码

论坛徽章:
0
5 [报告]
发表于 2014-08-23 21:48 |只看该作者
本帖最后由 cy西瓜仔 于 2014-08-23 21:49 编辑

回复 1# goddesschi


    楼主, 是否这样:
sed 's/\/home\/guest\/rt\/\[test\]\[autod\]\///g' test.txt
Whitney Houston[HAPPY]
111
222
333
444

sed 's#/home/guest/rt/\[test\]\[autod\]/##g' test.txt                             
Whitney Houston[HAPPY]
111
222
333
444

论坛徽章:
0
6 [报告]
发表于 2014-08-23 22:00 |只看该作者
本帖最后由 goddesschi 于 2014-08-23 22:01 编辑

呵呵,謝謝上面的大哥們,事實上不行這樣處理的
  1. /home/guest/rt/[test][autod]/
复制代码
這個字串其實是一個變量
雖然文字檔裡面秀的是
  1. /home/guest/rt/[test][autod]/Whitney Houston[HAPPY]
复制代码
但是實際上是兩個變量造成的結果
  1. $1$2
复制代码
因為$2我不會去動到他所以說裡面有無特殊字元我不需要去care
現在重點就在$1裡面有很大的機率會有特殊字元
一旦出現特殊字元sed處理就無效了
所以說各位大哥給的方法都是針對字串來拆解後套入sed
實際上我只能針對$1這個變量來處理

论坛徽章:
0
7 [报告]
发表于 2014-08-23 22:04 |只看该作者
Herowinter 发表于 2014-08-23 21:45
回复 1# goddesschi

意思就是說把$1的每個字元前面加上\後定義一個新變量(字串)再來處理嗎?
有點頭疼..哈

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
8 [报告]
发表于 2014-08-23 22:31 |只看该作者
回复 4# Herowinter

人家都说了要匹配的内容要用$1了
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2014-08-23 22:37 |只看该作者
楼主可以考虑一下用perl:
  1. perl -pe 's#\Q'"$1"'\E##g'
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
10 [报告]
发表于 2014-08-23 22:39 |只看该作者
如果你清楚有哪些元字符:
a='/home/guest/rt/[test][autod]/'
a="${a//[/\[}"
a="${a//]/\]}"
sed 's#'"$a"'##;' urfile


另,perl 的方法比较好。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP