亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 5983 | 回復(fù): 20
打印 上一主題 下一主題

[文本處理] 文本替換求助 [復(fù)制鏈接]

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期:2015-08-17 19:49:492015年亞洲杯之日本
日期:2015-04-30 01:24:342015年亞洲杯之約旦
日期:2015-04-01 00:37:182015年亞洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40處女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-12-28 12:07 |只看該作者 |倒序瀏覽
30可用積分
本帖最后由 bikkuri 于 2015-12-28 12:32 編輯

大家好!
我有一個問題向大家請教。
假如有以下兩個文件main.sh和new.def
# main.sh
#
#-----------------------DEFINITIONS-----------------------------
host1=www.baidu.com
host2=www.sina.com.cn
host3=www.netease.com
#-----------------------DEFINITIONS-----------------------------
for i in $(seq 3); do
[ ! "A"$(eval echo '$'host$i) = "A" ] && echo "host$i is $(eval echo '$'host$i)"
done


# new.def
#-----------------------DEFINITIONS-----------------------------
host1=www.google.com
host2=www.yahoo.com.cn
#-----------------------DEFINITIONS-----------------------------

希望用new.def中兩條分割線中間的內(nèi)容(行數(shù)不確定)來替換掉main.sh中兩條分割線中間的內(nèi)容(行數(shù)不確定)。
改變后新的main.sh的內(nèi)容應(yīng)該變成:
# main.sh
#
#-----------------------DEFINITIONS-----------------------------
host1=www.google.com
host2=www.yahoo.com.cn
#-----------------------DEFINITIONS-----------------------------
for i in $(seq 3); do
[ ! "A"$(eval echo '$'host$i) = "A" ] && echo "host$i is $(eval echo '$'host$i)"
done

謝謝大家!

論壇徽章:
54
2015亞冠之德黑蘭石油
日期:2015-07-07 13:00:1615-16賽季CBA聯(lián)賽之深圳
日期:2016-03-31 09:03:5415-16賽季CBA聯(lián)賽之遼寧
日期:2016-05-09 20:38:15程序設(shè)計版塊每日發(fā)帖之星
日期:2016-05-12 06:20:0015-16賽季CBA聯(lián)賽之四川
日期:2016-05-13 15:19:4715-16賽季CBA聯(lián)賽之福建
日期:2016-05-15 20:24:34每日論壇發(fā)貼之星
日期:2016-05-16 06:20:0015-16賽季CBA聯(lián)賽之吉林
日期:2016-05-26 11:49:4715-16賽季CBA聯(lián)賽之廣東
日期:2016-05-26 13:49:18極客徽章
日期:2016-12-07 14:05:2315-16賽季CBA聯(lián)賽之廣夏
日期:2016-12-20 17:33:532017金雞報曉
日期:2017-01-10 15:19:56
2 [報告]
發(fā)表于 2015-12-28 12:07 |只看該作者
本帖最后由 haooooaaa 于 2015-12-28 13:52 編輯
  1. awk -vRS='#--*DEFINITIONS--*\n' 'NR==FNR{if(FNR==2)s=$0;next}{printf "%s",FNR==2?RT s RT:$0}' new.def main.sh
  2. # main.sh
  3. #
  4. #-----------------------DEFINITIONS-----------------------------
  5. host1=www.google.com
  6. host2=www.yahoo.com.cn
  7. #-----------------------DEFINITIONS-----------------------------
  8. for i in $(seq 3); do
  9. [ ! "A"$(eval echo 'host$i) = "A" ] && echo "host$i is $(eval echo 'host$i)"
  10. done
復(fù)制代碼
  1. awk -F= -vOFS='=' 'NR==FNR{if(/^host/)a[++c]=$2;next}{if(/^host/)if(c){$2=a[c--]}else{next}}1' new.def main.sh
復(fù)制代碼

論壇徽章:
145
技術(shù)圖書徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11獅子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龍
日期:2014-01-08 15:26:12技術(shù)圖書徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [報告]
發(fā)表于 2015-12-28 12:29 |只看該作者
分成main.def跟main.src
main.sh = main.def + main.src

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期:2015-08-17 19:49:492015年亞洲杯之日本
日期:2015-04-30 01:24:342015年亞洲杯之約旦
日期:2015-04-01 00:37:182015年亞洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40處女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
4 [報告]
發(fā)表于 2015-12-28 12:36 |只看該作者
本帖最后由 bikkuri 于 2015-12-28 12:56 編輯

不能分的。
平時就是一個main.sh。
只在偶爾的情況下要修改definition。
這種情況下main.sh如果發(fā)現(xiàn)new.def文件的存在就把其內(nèi)容讀取替換main.sh中的內(nèi)容。
也就是說new.def只是一個臨時文件,其內(nèi)容被讀取以后就沒用了,會被刪除。

[root@nchip:/tmp/test]# grep -n DEF new.def
2:#-----------------------DEFINITIONS-----------------------------
5:#-----------------------DEFINITIONS-----------------------------
[root@nchip:/tmp/test]# grep -n DEF main.sh
3:#-----------------------DEFINITIONS-----------------------------
7:#-----------------------DEFINITIONS-----------------------------
[root@nchip:/tmp/test]#

能不能用grep命令得到要替換內(nèi)容的范圍,然后用sed -i來修改main.sh文件。
例如上面例子,用new.def的第2-5行替換main.sh的第3-7行。

回復(fù) 2# jason680


   

論壇徽章:
95
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
5 [報告]
發(fā)表于 2015-12-28 13:16 |只看該作者
回復(fù) 3# bikkuri


    寫個小腳本嘛:

#!/usr/bin/perl

use strict;
use warnings;

use v5.14;
use autodie;

if (@ARGV != 2) {
    die "Usage: $0 new.def main.sh";
}

my $replacements = load_replacement($ARGV[0]);

replace_and_print($replacements, $ARGV[1]);

sub load_replacement {
    local @ARGV = @_;

    my %replacements;
    my $separator = qr/^#-+(\w+)-+$/;
    my $keyword;

    while (<>) {
        if (/$separator/ ... /$separator/) {
            if (not $keyword) {
                $keyword = $1;
                push @{$replacements{$keyword}}, $_;
            } else {
                push @{$replacements{$keyword}}, $_;
                if (/$separator/) {
                    if ($keyword ne $1) {
                        die "Invalid file format: expect keyword $keyword, got $1";
                    }
                    $keyword = undef;
                }
            }
        }
    }

    wantarray ? %replacements : \%replacements;
}

sub replace_and_print {
    my $replacements = shift @_;
    local @ARGV = @_;

    my $separator = qr/^#-+(\w+)-+$/;
    my ($keyword, $in_replacement);
    while (<>) {
        if (/$separator/) {
            if (not $in_replacement) {
                $keyword = $1;
                if (exists $replacements->{$keyword}) {
                    $in_replacement = 1;
                }
            } else {
                print for @{$replacements->{$keyword}};
                $keyword = $in_replacement = undef;
            }
        } else {
            print unless $in_replacement;
        }
    }

    if ($in_replacement) {
        print for @{$replacements->{$keyword}};
    }
}

論壇徽章:
84
每日論壇發(fā)貼之星
日期:2015-12-29 06:20:00每日論壇發(fā)貼之星
日期:2016-01-16 06:20:00每周論壇發(fā)貼之星
日期:2016-01-17 22:22:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-01-20 06:20:00每日論壇發(fā)貼之星
日期:2016-01-20 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-01-21 06:20:00每日論壇發(fā)貼之星
日期:2016-01-21 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-01-31 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-01-14 06:20:00
6 [報告]
發(fā)表于 2015-12-28 13:27 |只看該作者
這個辦法比較笨:

[yjh@host tmp]$ awk 'BEGIN{RS="#-----------------------DEFINITIONS-----------------------------"} NR==1 {print $0}' kkk.txt >main.sh.new
echo "#-----------------------DEFINITIONS-----------------------------" >>main.sh.new
[yjh@host tmp]$ awk 'BEGIN{RS="#-----------------------DEFINITIONS-----------------------------"} NR==2 {print $0}' new.txt >>main.sh.new
echo "#-----------------------DEFINITIONS-----------------------------" >>main.sh.new
[yjh@host tmp]$ awk 'BEGIN{RS="#-----------------------DEFINITIONS-----------------------------"} NR==3 {print $0}' kkk.txt >>main.sh.new
  1. [yjh@host tmp]$ cat kkk.txt
  2. # main.sh
  3. #
  4. #-----------------------DEFINITIONS-----------------------------
  5. host1=www.baidu.com
  6. host2=www.sina.com.cn
  7. host3=www.netease.com
  8. #-----------------------DEFINITIONS-----------------------------
  9. for i in $(seq 3); do
  10. [ ! "A"$(eval echo 'host$i) = "A" ] && echo "host$i is $(eval echo 'host$i)"
  11. done
  12. [yjh@host tmp]$ cat new.txt
  13. # new.def
  14. #-----------------------DEFINITIONS-----------------------------
  15. host1=www.google.com
  16. host2=www.yahoo.com.cn
  17. #-----------------------DEFINITIONS-----------------------------
復(fù)制代碼

論壇徽章:
20
卯兔
日期:2015-01-26 22:05:142015亞冠之薩濟拖拉機
日期:2015-09-10 15:15:282015亞冠之阿爾希拉爾
日期:2015-09-25 17:37:53程序設(shè)計版塊每日發(fā)帖之星
日期:2015-10-03 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-09 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-17 09:07:15程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-25 06:20:34程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-25 06:20:34程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-25 06:20:342015亞冠之廣州富力
日期:2015-08-27 19:29:56每日論壇發(fā)貼之星
日期:2015-08-26 06:20:002015亞冠之阿爾希拉爾
日期:2015-05-18 17:26:27
7 [報告]
發(fā)表于 2015-12-28 13:35 |只看該作者
回復(fù) 1# bikkuri
  1. awk 'FNR==NR{if($0~/^#-+/&&!f){f=1;next}if($0~/^#-+/&&f){f=0}if(f){s=s?s"\n"$0:$0}next}/^#-+/&&!x{x=1;print;next}/^#-+/&&x{x=0;print s}x{next}1' new.def main.sh
  2. # main.sh
  3. #
  4. #-----------------------DEFINITIONS-----------------------------
  5. host1=www.google.com
  6. host2=www.yahoo.com.cn
  7. #-----------------------DEFINITIONS-----------------------------
  8. for i in $(seq 3); do
  9. [ ! "A"$(eval echo 'host$i) = "A" ] && echo "host$i is $(eval echo 'host$i)"
  10. done
復(fù)制代碼

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟拖拉機
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
8 [報告]
發(fā)表于 2015-12-28 13:56 |只看該作者
awk 'BEGIN{i=0;j=0}NR==FNR{a[i++]=$0;next}/DEFINITIONS/&&!mild{if(!mild){mild=1;print $0;next}}/DEFINITIONS/&&mild{while (j<(i-1))print a[++j];mild=0}mild{if (j < (i-2))$0=a[++j]; else {j++;next}}1' b.txt a.txt

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期:2015-08-17 19:49:492015年亞洲杯之日本
日期:2015-04-30 01:24:342015年亞洲杯之約旦
日期:2015-04-01 00:37:182015年亞洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40處女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
9 [報告]
發(fā)表于 2015-12-28 14:01 |只看該作者
本帖最后由 bikkuri 于 2015-12-28 14:01 編輯

謝謝您的幫助!
您的命令正是我想要的。
但是在處理實際腳本的時候發(fā)現(xiàn)出錯了。
例如將剛才的main.sh換成以下內(nèi)容。
  1. # main.sh
  2. #
  3. #-----------------------DEFINITIONS-----------------------------
  4. host1=www.baidu.com
  5. host2=www.sina.com.cn
  6. host3=www.netease.com
  7. #-----------------------DEFINITIONS-----------------------------
  8. base64_decode()
  9. {
  10. if [ -f /usr/bin/uudecode ] ; then
  11. echo "begin-base64 644 b" > $dec64
  12. awk '{print $0}' >> $dec64
  13. echo "====" >> $dec64
  14. uudecode -o $out64 $dec64
  15. cat $out64
  16. rm -f $dec64 $out64
  17. else
  18. local buff=""
  19. for buff in $(awk -v B64="$CODE" '{while(length()){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--){z=1;for(p=0;p<6*i;p++)z=z*2;t=t+z*((a[4-i]=="=")?0:index(B64,a[4-i])-1)}for(i=2;i>=0;i--)if(a[4-i]!="="){y=1;for(p=0;p<8*i;p++)y=y*2;printf("\\x%x",t/y);t%=y}}printf"\n"}');do printf "$buff"; done
  20. fi
  21. }
復(fù)制代碼
然后再執(zhí)行您的命令就會報錯:
  1. [root@nchip:/tmp/test]# awk -vRS='#--*DEFINITIONS--*\n' 'NR==FNR{if(FNR==2)s=$0;next}{printf FNR==2?RT s RT:$0;}' new.def main.sh
  2. # main.sh
  3. #
  4. #-----------------------DEFINITIONS-----------------------------
  5. host1=www.google.com
  6. host2=www.yahoo.com.cn
  7. #-----------------------DEFINITIONS-----------------------------
  8. awk: cmd. line:1: Invalid format specifier
  9. [root@nchip:/tmp/test]#
復(fù)制代碼
如果把那行最長的for開頭的行去掉,執(zhí)行就不會報錯。
為什么會有這種情況發(fā)生呢?
謝謝!

回復(fù) 5# haooooaaa


   

論壇徽章:
54
2015亞冠之德黑蘭石油
日期:2015-07-07 13:00:1615-16賽季CBA聯(lián)賽之深圳
日期:2016-03-31 09:03:5415-16賽季CBA聯(lián)賽之遼寧
日期:2016-05-09 20:38:15程序設(shè)計版塊每日發(fā)帖之星
日期:2016-05-12 06:20:0015-16賽季CBA聯(lián)賽之四川
日期:2016-05-13 15:19:4715-16賽季CBA聯(lián)賽之福建
日期:2016-05-15 20:24:34每日論壇發(fā)貼之星
日期:2016-05-16 06:20:0015-16賽季CBA聯(lián)賽之吉林
日期:2016-05-26 11:49:4715-16賽季CBA聯(lián)賽之廣東
日期:2016-05-26 13:49:18極客徽章
日期:2016-12-07 14:05:2315-16賽季CBA聯(lián)賽之廣夏
日期:2016-12-20 17:33:532017金雞報曉
日期:2017-01-10 15:19:56
10 [報告]
發(fā)表于 2015-12-28 14:03 |只看該作者
回復(fù) 9# bikkuri


    因為里面的 printf , 如果有百分號可能有問題, 已更改, 請看上面的相關(guān)內(nèi)容
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP