簡體   English   中英

sed / awk復制粘貼片段從同一文件中的一個位置移至另一位置

[英]sed/awk copy paste snippet from one place to other place in same file

如何使用sed/awk工具復制一些代碼片段並粘貼到同一文件中?

示例:文件名foo.txt具有以下文本,我想復制該文本並將其粘貼在同一文本下

ABC
DEF
GHI
JKL
MNO
PQR

最終輸出將是這樣。

    ABC
    DEF
    GHI
    JKL
    MNO
    PQR

    ABC
    DEF
    GHI
    JKL
    MNO
    PQR

OP要求提供sed,所以就在這里!

可能有很多方法可以實現,但是我知道這是一種:

sed 'H;$G' foo.txt
  • H :將當前文件追加到保持緩沖區
  • ; :分開兩個表達式
  • $ :文件結束時
  • G :打印保持緩沖區

可是等等! 還有更多!

永遠不要忘記ed是標准文本編輯器 (花了我一些時間來記住如何使用它,我必須說這並不光彩)。

對於示例,假設它在名為foo.ed的文件中(您可以在交互式會話中執行相同操作):

$a

.
,t$
$d
wq

然后將其用於:

ed foo.txt < foo.ed

一線不可讀的Bashism:

ed foo.txt <<< $'$a\n\n.\n,t$\n$d\nwq'

翻譯:

  • $a :在文件末尾插入所有內容(此處為一行),直到單個點.
  • ,t$ :將整個文件內容復制到末尾
  • $d :刪除最后一行,因為我不記得如何復制直到文件末尾的那一行!@#
  • wq :寫並退出

參考文獻:

假設您要復制整個文件,而又不想真正縮進輸出行,則永遠不要使用sed或awk,而只需使用cat和echo即可:

$ cat file; echo ''; cat file
$ cat file
ABC
DEF
GHI
JKL
MNO
PQR

ABC
DEF
GHI
JKL
MNO
PQR

如果要修改原始文件,只需將輸出重定向到tmp文件,然后將其mv到file:

(cat file; echo ''; cat file) > tmp && mv tmp file

正如Fedorqui在他的評論中指出的那樣,您可以在同一文件上多次運行Awk。

awk 'NR>1 && FNR==1 {print ""} {print "\t" $0}' foo.txt foo.txt

應該產生您想要的輸出。

可以使用bash括號擴展 foo.txt{,}簡化此操作。

另外,如果使用GNU Awk,則有一個稱為ENDFILE的內置規則,該規則可讓您在處理完每個文件中的最后一條記錄后采取行動:

awk '{print "\t" $0} ENDFILE{print ""}' foo.txt{,}

另外,您也可以是豬,將整個文件讀入內存,然后循環遍歷兩次。

awk '{
    a[NR]=$0
} END {
    num=2
    for (i=1; i<=num; i++) {
        for (j=1; j<=NR; j++)
            print "\t"a[j]
        if (i % num != 0)
            print ""
    }
}' foo.txt

您會注意到,每個行號NR也必須記錄為數組a的索引,以保留輸出中的原始順序。

暫無
暫無

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

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