为什么我的 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.
这里是新手,对于任何遗漏的 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.