我是bash脚本的新手。我有一个txt文件(称之为geom.txt
),我正在使用它,如下所示:
2
C -0.6165934086165 -0.35599823933468 0.00000000 0.8466
C 0.6165934086165 0.35599823933468 0.00000000 0.8466
lattice_vector 2.46670923 0.00000000 0.00000000
lattice_vector 1.23286602 2.13599798 0.00000000
lattice_vector 0.00000000 0.00000000 40
我想编写一个脚本,在第1行和第2行之间添加一行,以产生如下输出:
2
C -0.6165934086165 -0.35599823933468 0.00000000 0.8466
C 0.6165934086165 0.35599823933468 0.00000000 0.8466
lattice_vector 2.46670923 0.00000000 0.00000000
lattice_vector 1.23286602 2.13599798 0.00000000
lattice_vector 0.00000000 0.00000000 40
此外,我想使这个一般,以便前一个表单的任何输入文件将在第1行和第2行之间添加一个空行。我知道这是基本的,但我需要帮助!谢谢!
答案 0 :(得分:4)
使用gnu sed
:
sed -i.bak '2s/^/\n/' file
使用awk
:
awk 'NR==2{print "\n" $0; next}1' file
使用non-gnu sed
sed -i.bak $'2s/^/\\\n/' file
或者其他:
eol=$'\n'
sed -i.bak "2s/^/\\$eol/" file
最后这里是纯粹的BASH方式:
c=0
while IFS= read -r line; do
(( c++ == 1 )) && echo
echo "$line"
done < file
答案 1 :(得分:0)
或者您可以在简单的while循环中执行此操作:
let count=0 # set a simple integer to test
:> tmpfile # create or truncate tmpfile
while read line || test -n "$line"; do
echo "$line" >> tmpfile # write each line to tmpfile
# if this is the first line, add a newline and increment counter
test "$count" -eq 0 && echo "" >> tmpfile && ((count+=1))
done <"$1"
# when all lines written to tmpfile copy tmpfile to filename given as arg, remove tmpfile
cp tmpfile "$1" && rm -f tmpfile
答案 2 :(得分:0)
您可以使用vim
来实现目标。
vim -c 1 -c "normal o" -c wq geom.txt