一千萬個為什麽

搜索

如何顯示兩個特定字符串之間的所有字符?

我想在字符串“xxx”和“yyy”之間顯示文件中的所有字符(引號不是分隔符的一部分)。我怎樣才能做到這一點 ?例如,如果我輸入“Hello world xxx這是一個文件yyy”,輸出應該是“這是一個文件”

最佳答案

如果分隔符不一定在同一條線上,那麽問題才有意思。它可以通過多種方式完成(即使使用 sed ),但 awk 更靈活:

    #!/bin/sh
    awk '
    BEGIN { found = 0; }
    /xxx/ {
        if (!found) {
            found = 1;
            $0 = substr($0, index($0, "xxx") + 3);
        }
    }
    /yyy/ {
        if (found) {
            found = 2;
            $0 = substr($0, 0, index($0, "yyy") - 1);
        }
    }   
        { if (found) {
            print;
            if (found == 2)
                found = 0;
        }
    }
    '

對於使用以下數據最多只有一個子字符串在線上的情況,我們會對此進行測試:

    this is xxx yy
    first
    second yyy

    xxx.x
    yyy

    xxx#yyy

這個輸出(腳本是“foo”,數據是“foo.in”):

    $ cat foo.in|./foo
     yy
    first
    second 
    .x

    #

它的工作方式是輸入數據在 $ 0 中,awk按順序匹配模式 xxxyyy ,允許不止一個更改 $ 0 的路徑,直到最後一步打印它。

順便說一句,這個例子不適用

xxxxHelloyyyxxxWorldyyy

因為它只檢查第一場比賽。 Perl腳本將給出不同的結果,因為它使用貪婪匹配而不是我在awk示例中使用的index/substr。當然,Perl可以使用腳本執行相同的操作。

Awk(像Perl一樣)是自由格式的,因此可以將命令表達為類似的東西

awk 'BEGIN{found=0;}/xxx/{if(!found){found=1;$0=substr($0,index($0, "xxx")+3);}}/yyy/{if(found){found=2;$0=substr($0,0,index($0,"yyy")-1);}}{ if(found){print;if(found==2)found=0;}}'

但除了舉例外,很少這樣做。同樣, sed 腳本(面向行)可以組合成一行,但有一些限制。同樣, sed 中的復雜腳本很少以這種方式處理。相反,它們被視為真正的程序(參見示例)。

進一步閱讀:

轉載註明原文: 如何顯示兩個特定字符串之間的所有字符?