我一直在编辑一个包含成对行的大型文本文件,如下所示(重复):
\> destination_file.txt
js -e "var e='.jpg',t='b',i='14712583',h='0.us.is.example.com',s='/',n='WIV',u='jasper1123/3/example.com_'+i+n.charAt(2)+n.charAt(0)+n.charAt(1); console.log('http://'+t+h+s+u.charAt(0)+s+u+e);"
更正版本如下:
line 1
line 2
line 3
line 4
如何将第一行移动到第二行末尾,如下所示:
line 2
line 1
line 4
line 3
该文本文件包含数千对如上所述的行。
我可以运行终端命令来执行此操作吗?
基本上,上面的数据是无数个html页面组合和编辑的结果。
任何建议,将不胜感激。
我之所以能走到这一步,很大程度上是通过这个论坛的帮助。
答案1
sed -e '1~2{h;d};G'
GNUsed
表达式的详细信息:
1~2 { # lines 1,3,5,7 etc.
h # save line in the hold space
d # delete (don't print yet) and start next line
}
# only reached on lines 2,4,6,8 etc.
G # retrieve from hold space, append to current line
答案2
我认为前面的反斜杠>
只是一个错字。如果您的文本文件格式正确,您可以使用此 bash 脚本:
#!/bin/bash
while
read -r a && # store one line to $a
read -r && # consume the blank line
read -r b # store another line to $b
do
echo $b$a # join those two lines
read -r # whatever, try to consume a blank line
done
将其保存到s.sh
.
你的文件内容是这样的:
A
A-
B
B-
C
C-
然后运行bash s.sh < file.txt
你会得到:
A-A
B-B
C-C
答案3
$ printf '1m2\n,p\n' | ed -s file
line 2
line 1
line 3
line 4
该m
命令在编辑器中移动一行ed
。 1m2
将第 1 行移动到第 2 行。,p
在标准输出上显示修改后的缓冲区。
对于就地编辑文件的替代方法:
ed -s file <<END_ED
1m2
w
q
END_ED
这将执行移动,将结果写回文件并退出。
答案4
使用珀尔,如果你的文件不是太大而不能被 RAM 内存吞没:
perl -0 -e ' # -0 slurp the whole file
$\ = $, = "\n"; # change record & list separator
my @file = split /\n/, <>; # split the file on line per array value
print @file[1,0,2..$#file] # array slice
' file
如果你想更换到位, 使用
perl -i -e ......