![](/img/trans.png)
[英]Use sed or awk to find match and leave it in place but add it somewhere alse
[英]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.