为什么我的 sed 输出到文件与终端输出不同?

Why is my sed output to file different from terminal output?

这里是新手,对于任何遗漏的 info/silly 错误,我们深表歉意!

我有一个包含一系列数据集的文本文件。每个数据集包含6组坐标('landmarks'),一个比例尺和一个标本ID,像这样;

LM=6
111 111
222 222
333 333
444 444
555 555
666 666
SCALE=0.123
ID=MS17_female_8_central_2.jpg

我想把第一个坐标下移到第六个坐标,像这样;

LM=6
222 222
333 333
444 444
555 555
666 666
111 111
SCALE=0.123
ID=MS17_female_8_central_2.jpg

所以我尝试使用 sed(可能很笨拙)。这在终端中有效;

sed '/LM/{n;H;d;}; /SCALE/{x;1!G;s/\n//;}' < in.txt

一切看起来都很好。 但是,一旦我尝试了这个;

sed '/LM/{n;H;d;}; /SCALE/{x;1!G;s/\n//;}' < in.txt > out.txt

创建的文件中的输出不同。第一个数据块看起来不错,但从那时起,我也设法从前一个数据块中插入 'SCALE' 行...

LM=6
222 222
333 333
444 444
555 555
666 666
111 111
SCALE=0.123
ID=MS17_female_16_central2.jpg

LM=6
222 222
333 333
444 444
555 555
666 666
SCALE=0.123
111 111
SCALE=0.124
ID=MS17_female_18_central2.jpg

LM=6
222 222
333 333
444 444
555 555
666 666
SCALE=0.124
111 111
SCALE=0.125
ID=MS17_female_19_central2.jpg

我完全相信我在我的 sed 中做了一些愚蠢的事情,但我无法弄清楚为什么终端和文件输出会不同..非常感谢任何帮助!

这可能适合您 (GNU sed):

sed '/^LM/{n;h;d};/^SCALE/{x;p;x}' file

匹配一行开始 LM 然后打印它,将下一行提取到保留中 space 并删除提取的行。

匹配一行 beginnng SCALE,交换到保留 space,打印它并交换回来。

N.B。 h 命令覆盖保留 space 中已有的内容,而 H 命令附加到它(使用换行符作为分隔符)。同样,g 命令用 hold space 的内容替换当前行,而 G 命令将 hold space 附加到当前行(以换行符作为分隔符) ).


多思考一下:

sed '/^LM/{n;h;d};/^SCALE/{H;g}' file

使用sed

$ sed '/^LM/{n;x;d};/^SCALE/{x;G}' < input_file > output_file
$ cat  output_file
LM=6
1187.62419327203 1128.4674167571
1140.25198469359 1081.09520817865
1163.93808898281 983.390027985608
1255.72174310355 971.546975840996
1300.13318864584 1021.87994745559
1282.36861042892 1113.66360157633
SCALE=0.120625275573192
ID=MS17_female_8_central_2.jpg

why the terminal and file outputs would be different..

您正在查看不同程序中的输出。终端将 carriage return 字符解释为 return 光标到行的开头,这导致该行被下一行覆盖。而其他程序将 carriage return 字符解释为换行符。

您的 sed 脚本 H; 追加 以保持 space,因此它只会变得更大。您可能想要 h 替换保持space.