免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ly5066113
打印 上一主题 下一主题

[学习共享] 文本编辑的一点心得--sed篇 [复制链接]

论坛徽章:
0
101 [报告]
发表于 2014-02-23 21:10 |只看该作者
师父。。。。。徒弟看不懂。。。。。。。

论坛徽章:
8
天秤座
日期:2013-09-02 09:10:44CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-11-20 16:38:31巨蟹座
日期:2013-12-18 13:03:34天秤座
日期:2013-12-31 13:28:40卯兔
日期:2014-01-22 17:09:40技术图书徽章
日期:2014-02-27 20:31:47巳蛇
日期:2014-09-22 10:25:32
102 [报告]
发表于 2014-02-24 13:29 |只看该作者
     感谢楼主分享,先顶了!

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
103 [报告]
发表于 2014-02-26 16:11 |只看该作者
本帖最后由 toddhai 于 2014-02-26 16:12 编辑

回复 1# ly5066113


    ly5066113@ubuntu:~$ sed '/a/{x;s/^/./;/^.\{3\}$/{x;s/a/b/;b};x}' urfile
a
a
b
a
a
a
ly5066113@ubuntu:~$ sed '/a/{x;s/^/./;/^.\{4\}$/{x;s/a/b/;b};x}' urfile
a
a
a
b
a
a
ly5066113@ubuntu:~$ sed '/a/{x;s/^/./;/^.\{5\}$/{x;s/a/b/;b};x}' urfile
a
a
a
a
b
a
我们可以看到,对于次数的增加,我们只需要调整需要匹配的数值即可。
        /a/{                 #匹配时,开始记数
                x                #交换pattern space与hold space
                s/^/./           #向hold space打一个 .
                /^.\{3\}$/{      #判断 . 的个数是否达到要求
                        x            #如果达到要求,交换hold space与pattern space
                        s/a/b/       #进行替换
                        b            #跳转到代码结束
                }                #
                x                #交换hold    s/^/./           #向hold space打一个 . space与pattern space
        }                    #


--------------------------------------------------------------------
--------------------------------------------------------------------
当我在看解释时发现 s/^/./           #向hold space打一个 .    这行解释中应该是向pattern space打点,sed中的编辑操作不是都在pattern space中进行吗?不知道我说的对不对^_^


论坛徽章:
0
104 [报告]
发表于 2014-12-03 16:17 |只看该作者
好东西啊,谢谢楼主分享

论坛徽章:
0
105 [报告]
发表于 2014-12-05 09:12 |只看该作者
  1. #!/bin/bash
  2. set -x
  3. LOGIN_USER=testuser1
  4. XML_FILE='/tmp/test.xml'
  5. Failed_log=/tmp/failed.log
  6. remote_host="${HOST}" #HOST为另一脚本变量
  7.     ping -c 1 ${HOST}  > /dev/null 2>&1
  8.    
  9. if [ $? != 0 ];then
  10.            echo "${HOST} | ERROR : can't reach server ${HOST}" | tee -a  ${Failed_LOG}
  11.     else
  12.           ssh -q "${LOGIN_USER}"@"${remote_host}" "echo test" > /dev/null
  13.           if [ $? != 0 ];then
  14.                echo "${HOST} | ERROR : SSH Login failed for server ${HOST}" | tee -a  ${Failed_LOG}
  15.        else
  16.                line=$(ssh -q -t $LOGIN_USER@"${remote_host}" "cat -n $XML_FILE | grep -F '<key>Server</key>'|awk '{print \$1}'")
  17.        line=`echo $line | sed 's#\\r##g'`
  18.        line=$(($line + 1))
  19.        vp=$(ssh -q -t  $LOGIN_USER@"${remote_host}" "cat -n $XML_FILE | grep -F $line | awk -F '>' '{print \$2}'|awk -F '<' '{print \$1}'")
  20.       #SED_COMMAND="sed -i "s/$vp/$EDGE/g" $XML_FILE"
  21.                 ssh  -t $LOGIN_USER@"${remote_host}" "/bin/sed -i s/${vp}/${EDGE}/g ${XML_FILE}" #这一步执行出错
  22.        #tt=$(ssh $LOGIN_USER@"${remote_host}" "find -type f -name ${XML_FILE}|xargs perl -pi -e 's|${vp}|${EDGE}|g'")
  23.                 nvp=$(ssh -q -t  $LOGIN_USER@"${remote_host}" "cat -n $XML_FILE | grep -F $line | awk -F '>' '{print \$2}'|awk -F '<' '{print \$1}'")
  24.      fi
  25. fi
复制代码
追踪执行过程,远程执行sed那一步有问题,我也不知道错误在哪里... 请教高手

+++ ssh -q -t testuser1@tcd1a 'cat -n /tmp/test.xml | grep -F 198 | awk -F '\''>'\'' '\''{print $2}'\''|awk -F '\''<'\'' '\''{print $1}'\'''

++ vp=$'test,stedgevp01\r'

/test/g /tmp/test.xml'd1a '/bin/sed -i s/test,stratisedgevp01

论坛徽章:
0
106 [报告]
发表于 2015-01-15 16:03 |只看该作者
本帖最后由 kerrigan007 于 2015-01-15 16:07 编辑

关于例3中的打点技术运用,用楼主的方法仍是只能替换第三行的a,而不是第三次出现的a。
如果我把urfile内容修改如下:
ly5066113@ubuntu:~$ cat urfile
aa
a
a
a
a
a
使用楼主的方法结果如下,仍是替换第三行的a,而不是第三个a,楼主举得运用0,/a/替换第一次、第二次和第三次出现的a的三个例子亦是如此,实际只是替换对应行出现的a,不知道意义何在?
ly5066113@ubuntu:~$ sed '/a/{x;s/^/./;/^.\{3\}$/{x;s/a/b/;b};x}' urfile
aa
a
b
a
a
a

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
107 [报告]
发表于 2015-01-15 16:19 |只看该作者
回复 106# kerrigan007


如果只想匹配单个字母 a ,要修改正则
  1. sed '/\<a\>/{x;s/^/./;/^.\{3\}$/{x;s/a/b/;b};x}' urfile
复制代码

论坛徽章:
0
108 [报告]
发表于 2015-01-15 16:47 |只看该作者
回复 107# ly5066113

加了尖括号只是匹配单独的a,而不匹配aa了,但我的意思却是您在例3中引用了sed ':a ; N ; $!ba ;s/root/mmmm/4'这个例子,它能替换第4次出现的root,也能替换第n次出现的root。随后您列举了这例子的弊端,然后步步推进,引出打点记数的方法来实现,但这个打点记数的方法只是替换第n行出现的a,而不是第n次,这样的话用sed 'ns/a/b/' urfile (把ns的n换成数字)不就行了嘛,何必要用打点记数如此复杂呢?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
109 [报告]
发表于 2015-01-15 16:58 |只看该作者
回复 108# kerrigan007


只是提供一种记数的方法,至于是第n次还是第n行,就看前面的正则了。

论坛徽章:
0
110 [报告]
发表于 2015-04-22 13:12 |只看该作者
我仔细的阅读了,受益匪浅
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP