如何使用sed/awk
工具复制一些代码段并粘贴到同一文件中?
示例:文件名foo.txt
包含以下文字我要复制并粘贴到同一文本下面
ABC
DEF
GHI
JKL
MNO
PQR
最终输出就像。
ABC
DEF
GHI
JKL
MNO
PQR
ABC
DEF
GHI
JKL
MNO
PQR
答案 0 :(得分:6)
可能有很多方法可以实现它,但这是我所知道的:
sed 'H;$G' foo.txt
H
:将当前文件追加到hold buffer ;
:将两个表达式分开$
:文件结束时G
:print hold buffer 永远不要忘记 ed
是标准文字编辑器(花了一些时间记住如何使用它,我不得不说明了这一点。)< / p>
对于示例,让我们在名为foo.ed
的文件中说明(您可以在交互式会话中执行相同操作):
$a
.
,t$
$d
wq
然后将其用于:
ed foo.txt < foo.ed
单行不可读的基础:
ed foo.txt <<< $'$a\n\n.\n,t$\n$d\nwq'
翻译:
$a
:在文件的末尾插入所有内容(此处只有一个新行),直到单点.
,t$
:将整个文件内容复制到最后$d
:删除最后一行,因为我不记得如何复制到文件结尾之前的行!@#wq
:写并退出参考文献:
答案 1 :(得分:4)
假设您想要复制整个文件而不想真正缩进输出行,那么您永远不会使用sed或awk,只需要cat和echo:
$ cat file; echo ''; cat file
$ cat file
ABC
DEF
GHI
JKL
MNO
PQR
ABC
DEF
GHI
JKL
MNO
PQR
如果你想修改原始文件,只需将输出重定向到tmp文件,然后将其转换为文件:
(cat file; echo ''; cat file) > tmp && mv tmp file
答案 2 :(得分:1)
Fedorqui在评论中指出,你可以多次在同一个文件上运行Awk。
awk 'NR>1 && FNR==1 {print ""} {print "\t" $0}' foo.txt foo.txt
应该产生你想要的输出。
可以使用bash brace expansion 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
的索引,以保留输出中的原始顺序。