如何使用vi包中的ex命令输出文件内容?
如何使用vi包中的ex命令输出文件内容?
我懂你这情况!同样是ex命令,朋友那边是vim的符号链接版本,用ex -s -c %p -c q /etc/hosts就能顺顺当当输出文件内容,结果你装的是Arch里原生vi包的ex,跑同样的命令啥反应都没有,属实有点闹心。
这核心问题是原生vi的ex和vim的ex是完全不同的实现,语法细节差得不少:原生ex对静默模式下的输出控制更严格,%p这种打印缓冲区的命令在-s(静默)模式下不会主动把内容输出到标准输出,自然就看不到结果了。
给你两个实用的解决方法,选哪个看你需求:
方法一:用ex的重定向命令直接输出(推荐)
原生ex里可以用w !cat命令把缓冲区内容通过cat输出到终端,配合静默模式就能干净输出文件内容:
ex -s -c 'w !cat' -c q /etc/hosts
拆解下这个命令的逻辑:
-s:开启静默模式,避免输出ex的启动提示、文件状态这些冗余信息-c 'w !cat':执行ex内置命令,把当前打开的文件缓冲区内容“写”到cat命令的标准输入,cat会直接把内容打印出来-c q:执行完打印操作后自动退出ex,不用手动输入:q
方法二:打印指定行范围(需过滤冗余信息)
如果你更习惯用行范围打印的思路,也可以用1,$p表示“从第1行到最后一行全部打印”,但原生ex会额外输出文件状态提示,需要用grep过滤掉:
ex -c '1,$p' -c q /etc/hosts | grep -v '^"'
这个方法需要多一步过滤,不如方法一简洁,所以更推荐第一种。
额外小建议
如果你之后经常需要用vim风格的ex语法,也可以直接装vim包,这样系统里的ex会自动变成vim的符号链接,就能和朋友一样用原来的命令了:
sudo pacman -S vim
当然这是可选的,要是就想用原生vi的ex,方法一完全够用。
备注:内容来源于stack exchange,提问作者KamilCuk
相关产品推荐
相关产品推荐

