Bash - 对文件中的行进行排序

Das*_*San 2 linux sorting bash lines range

嗨其他溢出用户.

我很想知道如何通过Linux中的终端命令对文件中的一系列行进行排序.

例如在test.sh文件中:

g++ -o test.out \
Main.cpp \
Framework.cpp \
Sample.cpp \
Blub.cpp \
-std=c++14 -lboost
Run Code Online (Sandbox Code Playgroud)

如何从此文件中的第二行到第二行(源文件名)进行排序.

期望的输出:

g++ -o test.out \
Blub.cpp \
Framework.cpp \
Main.cpp \
Sample.cpp \
-std=c++14 -lboost
Run Code Online (Sandbox Code Playgroud)

(从第2 - 5行排序)

感谢您的关注 :)

Kus*_*nda 6

使用ex行编辑器排序:

$ cat file
g++ -o test.out \
Sample.cpp \
Main.cpp \
Framework.cpp \
Blub.cpp \
-std=c++14 -lboost

$ echo 'x' | ex -s -c '2,5!sort' file

$ cat file
g++ -o test.out \
Blub.cpp \
Framework.cpp \
Main.cpp \
Sample.cpp \
-std=c++14 -lboost
Run Code Online (Sandbox Code Playgroud)

ex -s -c '2,5!sort'ex进入批处理模式(with -s)并将该命令2,5!sort应用于输入文件.这将通过sort使用给定范围内的行执行外部实用程序,然后使用输出替换相同的行来对第2行到第5行进行排序sort.

echo 'x'用于发送的x命令,ex这将使其节省了修改过的缓冲区并退出.如果没有这个,你将不得不x在终端手动输入并按下Enter退出ex.

这假设经典ex(在BSD中找到).如果你有exVim发行版,你可以使用

$ ex -s -c '2,5 sort|x' file
Run Code Online (Sandbox Code Playgroud)

这在Vim中使用内部排序命令ex(与:sortVim中相同).


根据意见要求:

使用BSD对文件中第2行到第二行到最后一行的所有行进行排序ex:

$ echo 'x' | ex -s -c '2,$-1!sort' file
Run Code Online (Sandbox Code Playgroud)

或者,与Vim的ex:

$ ex -s -c '2,$-1 sort|x' file
Run Code Online (Sandbox Code Playgroud)

范围从2,5变为2,$-1,即从第2行变为"结束减1".


遗憾的是,sed它不支持相同类型的操作.