簡體   English   中英

如何有條件地用sed或其他linux工具交換兩行?

[英]How can I conditionally swap two lines with sed or other linux tool?

我想交換兩行,但前提是它們的順序錯誤。 例如,如果我有XML行(在文件中的任何地方,在某些位置不是必需的),如下所示:

<person>
    <given-name>John</given-name> 
    <surname>Smith</surname>
</person> 

我想交換第二行和第三行,以便產生

<person>
    <surname>Smith</surname>
    <given-name>John</given-name> 
</person> 

但僅適用於那些行順序混亂的文件。 有沒有辦法用sed或其他linux工具來做到這一點?

這可能對您有用(GNU sed);

sed -r '$!N;s/^(\s*<given-name>.*)\n(\s*<surname>.*)/\2\n\1/;P;D' file

一次讀取2行,如果組合錯誤,則換行。

假設“第4行”和“第3行”是模式,而不是整個行:

awk -v first="line 4" -v second="line 3" '
    $0 ~ second { seen_second = 1 } 
    $0 ~ first && ! seen_second {
        this_line = $0
        # assume the second line is the *next* line
        getline
        print
        print this_line
        next
    } 
    1
' file

這不會修改文件。 要做到這一點:

awk '...' file > tempfile &&
mv file file.bak &&
mv tempfile file

如果您希望surnamegiven-name之前並具有以下數據:

cat file
<person>
    <given-name>John</given-name>
    <surname>Smith</surname>
</person>
<person>
    <surname>Hanson</surname>
    <given-name>Thor</given-name>
</person>

然后,如果錯誤,此awk將更surnamegiven-name的順序:

awk '/<person>/ {f=NR} f && f+1==NR && /<given-name>/ {a=$0;getline;print $0 RS a;next} 1' file
<person>
    <surname>Smith</surname>
    <given-name>John</given-name>
</person>
<person>
    <surname>Hanson</surname>
    <given-name>Thor</given-name>
</person>

這個怎么運作:

awk '
/<person>/ {                        # if line include <person> do:
    f=NR}                           # do set flag "f" to line record
f && f+1==NR && /<given-name>/ {    # if flag "f" is true and flag "f+1" equal "NR" and line include <given-name> do:
    a=$0                            # set "a" to current line
    getline                         # get next line
    print $0 RS a                   # print current line and previous line
    next}                           # skip to next record
1                                   # print all other lines
    ' file                          # read the file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM