我想交换文件夹中所有文件的前两行,并将其保存在现有文件中,保留文件名。
我有什么:
awk '{getline x;print x}1' *.map.txt
这只能写在前两行吗?
这样做只是在终端中打印每个文件的所有输出。
答案 0 :(得分:1)
你可以用sed:
来做sed '1{h;d};2{x;H;x}'
说明:
1 and 2 are line number selectors ; the following commands will only be executed on those lines
h puts the current line in the 'hold' buffer
d deletes the line
x swaps the hold buffer with the current line
H appends the current line to the hold buffer
使用GNU sed测试运行:
$ mkdir test35597922 $ echo """line1 > line2 > line3""" > test35597922/file1.txt $ echo """line1 line2 line3""" > test35597922/file2.txt $ sed -i '1{h;d};2{x;H;x}' test35597922/* $ ls test35597922/ file1.txt file2.txt $ cat test35597922/file1.txt line2 line1 line3 $ cat test35597922/file2.txt line2 line1 line3
如果你不能使用'到位' -i
标记并想要编辑文件,您可以按如下方式处理:
for file in test35597922/*; do
sed '1{h;d};2{x;H;x}' $file > tmp_file
mv tmp_file $file
done
在某些系统上,它可以在一个操作(sed '1{h;d};2{x;H;x}' $file > $file
)中完成,但在其他系统上会失败,文件在完全被读取之前会被覆盖。
答案 1 :(得分:1)
使用ed
(和Bash):
for file in ./*; do
[[ -f $file ]] || continue
ed -s "$file" <<< $'1m2\nw\nq\n'
done
执行操作的ed
命令是:1m2
选择第一行并将其移动到第二行。如果你有0行或1行的文件,你会在标准错误上看到一些无害的?
。您可以在/dev/null
之后添加2> /dev/null
,将其重定向到done
。
答案 2 :(得分:0)
另一个sed
:
sed -e '1{N;s/^\(.*\)\n\(.*\)/\2\n\1/;}' file
使用-i
影响文件中的更改。
如果您没有-i
选项,请尝试以下方式。
sed -e '1{N;s/^\(.*\)\n\(.*\)/\2\n\1/;}' file > new_file && mv new_file file