基本上我要做的是从 A.txt 移动第 1 到 4
行,并用它们替换 B.txt 中的第 5 到 8 行。
我想出了如何用 sed 获取前四行,
但我不知道如何“发送”它们来替换第二个 txt 文件中的行。
cat A.txt
1 a
2 b
3 c
4 d
5 e
cat B.txt
one
two
three
four
five
six
seven
eigh
nine
结果
one
two
three
four
1 a
2 b
3 c
4 d
nine
对于您的示例,此 awk 单线也适用:
awk 'NR>4&&NR<9{getline $0<"a.txt"}7' b.txt
这将打印预期的输出,如果要将其保存回 b.txt,则需要使用重定向。
这可能对您有用(GNU sed):
sed -i -e '5,8R a.txt' -e '5,8d' b.txt
这awk
应该这样做:
awk 'FNR==NR {a[NR]=$0;next} FNR>=5 && FNR<=8 {$0=a[FNR-4]}1' A.txt B.txt > tmp && mv tmp B.txt
它将行存储A.txt
在一个名为a
Then if line number of B.txt
are between 5
and 8
replace value using info from arraya
结果存储在临时文件中tmp
,然后移回B.txt
#!/usr/local/bin/bash -x
sed -n '1,4p' B.txt > B.txt.tmp
sed -n '1,4p' A.txt >> B.txt.tmp
sed -n '9p' B.txt >> B.txt.tmp
mv B.txt B.txt.bak
mv B.txt.tmp B.txt
这是静态的。不过,只要您知道您的线路地址,这将起作用。
如果你想支持可变跨度长度,你需要在你的文件中做这样的事情: -
#----------numbers-begin----------
one
two
three
four
#----------numbers-end----------
从那里,您可以通过以下方式在文件中找到它们:-
sed -n '/--numbers-begin--/,/--numbers-end--/p' <filename> > newfile
这不仅为您提供了可以使用的锚点,而且 sed 打印是我自己在脚本中为变量导入字符串的首选方法,因为它不会像 cat 那样导致 shell 尝试将文本解释为命令一些原因。
您可以在以后的文件中做的另一件事是这样的:-
numbers:one
numbers:two
numbers:three
numbers:four
words:dog
words:cat
words:rat
然后:-
#!/usr/local/bin/bash
for i in $(sed -n '/^/,/$/p' file)
do
if [ $(echo ${i} | sed -n '/numbers/p' ]
then
echo ${i} | cut -d':' -f2 >> numbers-only-file
fi
done
数据结构化。这都是关于数据结构的。正确地构建您的数据,您将几乎没有任何工作。