免费注册 查看新帖 |

Chinaunix

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

请问怎么才能互换两行呢? [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2004-06-20 23:10 |只看该作者

请问怎么才能互换两行呢?

shell 只是一個工具,一個 user interface 而已,
麻不麻煩,是看運用工具的"人",而非工具本身...
當你在批評某一事物時,若能同時提出更好的方案,其說服力將更好。
否則,可以暫時"忍"一下了吧...

如下是一個 bash script 的範例:
  1. #!/bin/bash

  2. usage () {
  3.         echo "Usage: $0 text.file string1 string2"
  4.         exit 1
  5. }

  6. [ "$#" -eq 3 ] || usage
  7. file $1 | grep -wq text || {
  8.         echo "Error: $1 is not a text file."
  9.         usage
  10. }

  11. file=$1
  12. str1=$2
  13. str2=$3
  14. ln1=$(grep -n $str1 $file | cut -d: -f1)
  15. ln2=$(grep -n $str2 $file | cut -d: -f1)

  16. rep () {
  17.   line=$(grep $1 $file)
  18.   shift 1
  19.   n=1
  20.   for i; do
  21.         str=$(echo "$line" | sed -n "${n}p")
  22.         echo -n "${i}s/.*/${str:=$_str}/; "
  23.         ((n++))
  24.         _str=$str
  25.   done
  26. }

  27. sed "$(rep $str2 $ln1)" $file | sed "$(rep $str1 $ln2)"
复制代码


這個 script 可以處理多行的替換。
這裡的多行,可以是被替換行,也可以是用以替換的行。
比方說:
  1. $ cat 1.txt
  2.      1  aaa 1
  3.      2  bbb 1
  4.      3  ccc 1
  5.      4  xxx 1
  6.      5  yyy 1
  7.      6  zzz 1
  8.      7  aaa 2
  9.      8  bbb 2
  10.      9  ccc 2
  11.     10  xx 2
  12.     11  yyy 2
  13.     12  zzz 2
  14.     13  aaa 3
  15.     14  bbb 3
  16.     15  ccc 3
  17.     16  xxx 3
  18.     17  yyy 3
  19.     18  nnn 3
复制代码

然後將含有 aaa 與含有 xxx 的互換,
但限制條件是:
1) 若多行被發現,只有相對的行被替換,也就是:第一行 aaa 與第一行 xxx 互換,然後第二行互換...
2) 不能做到交叉行數的替換,也就是第一行換成第二行,然後第三行換為第七行之類的。
3) 當行數不一至時,多餘的行將被換為最後一行。比方說,若 aaa 多於 xxx ,那多出來的 aaa 將全換為最後一行 xxx 。反之若是 xxx 多於 aaa ,則多出的 xxx 被換為最後一行 aaa 。

如下是執行結果:
  1. $ ./1.sh 1.txt aaa xxx
  2.      4  xxx 1
  3.      2  bbb 1
  4.      3  ccc 1
  5.      1  aaa 1
  6.      5  yyy 1
  7.      6  zzz 1
  8.     16  xxx 3
  9.      8  bbb 2
  10.      9  ccc 2
  11.     10  xx 2
  12.     11  yyy 2
  13.     12  zzz 2
  14.     16  xxx 3
  15.     14  bbb 3
  16.     15  ccc 3
  17.      7  aaa 2
  18.     17  yyy 3
  19.     18  nnn 3
  20. $ ./1.sh 1.txt aaa nnn
  21.     18  nnn 3
  22.      2  bbb 1
  23.      3  ccc 1
  24.      4  xxx 1
  25.      5  yyy 1
  26.      6  zzz 1
  27.     18  nnn 3
  28.      8  bbb 2
  29.      9  ccc 2
  30.     10  xx 2
  31.     11  yyy 2
  32.     12  zzz 2
  33.     18  nnn 3
  34.     14  bbb 3
  35.     15  ccc 3
  36.     16  xxx 3
  37.     17  yyy 3
  38.      1  aaa 1
复制代码

在 aaa 與 xxx 的替換中,aaa 多於 xxx ,因此第 7 與第 13 行都被第 16 行替換了。
在 aaa 與 nnn 的替換中,則全部的 aaa 都換為第 18 行了。

因不知樓主的具體要求,以上只是一個範例,寫著玩的...
若有同好提出更好的,不妨也來交流交流...  ^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP