在 (Linux) 终端中,有时查看行尾并不那么重要,但更重要的是不要弄乱行首。例如
line1 sddd dd ddd
line2 sdafss ss s
line 3 da aaaa aa
而不是
line1 sddd dd ddd
dd dddd dd
line2 sdafss ss s
s ss
line 3 da aaaa aa
有没有办法“剪切”或“隐藏”终端窗口末尾的行结尾,就像“less -S”一样,但用于正常输出?
答案1
换行禁用支持取决于终端。例如,如果使用,screen
您可以点击Ctrl- A Ctrl-R来切换换行。
否则,您可以尝试setterm -linewrap off
增加或不增加终端列的数量stty
(还没有尝试过)。
终端仿真器(例如 PuTTY) (如果你从 Windows 机器连接到服务器) 具有他们自己的设置。
如果终端支持VT 转义代码,echo -ne "\x1b[?7l"
将禁用屏幕换行(echo -ne "\x1b[?7h"
将启用它)。
请注意,在一个终端中有效的东西可能在另一个终端中无效 - 例如,我现在在 Linux OpenSuSE 12.3 上的 PuTTY 窗口上使用 bash,使用screen
: 其控制序列完美运行,而 VT 代码和术语则不行。在较旧的 SuSE 11(非 GUI)上的文本模式控制台上,VT 序列有效(可能screen
也会有效),但stty
显然被忽略了。
答案2
令我惊讶的是,即使过了 10 年,也没有人提到cut
(来自 gnu coreutils)可以完全满足您的要求。只需将您的输出传输到cut
:
使用 55 列宽的终端窗口(只是为了证明这有效):
$ cat cutTest.txt # shows automatic folding/wrapping
Line 1 is too long, line 1 is too long, line 1 is too l
ong, yes line 1 is too long!
Line 2 is too long, line 2 is too long, line 2 is too l
ong, yes line 2 is too long!
$ cut -c-40 < cutTest.txt # cuts after 40 columns/characters
Line 1 is too long, line 1 is too long,
Line 2 is too long, line 2 is too long,
$ cat cutTest.txt | cut -c-40 # Using a pipe
Line 1 is too long, line 1 is too long,
Line 2 is too long, line 2 is too long,
如果您的终端跟踪窗口宽度(确实如此bash
),您可以使用以下命令在终端窗口末尾剪切“(按照原始问题):
$ cat cutTest.txt | cut -c-$COLUMNS
Line 1 is too long, line 1 is too long, line 1 is too l
Line 2 is too long, line 2 is too long, line 2 is too l
答案3
如果您不想弄乱您的终端,这里有一个我非常依赖的快速脚本:
# Truncate input(s) to the current terminal width
# Usage: trunc [-r] [FILE...]
trunc() {
local B='^' A=
if [ -z "$COLUMNS" ]; then COLUMNS="$(tput cols)"; fi
if [ "$1" = '-r' ]; then shift; B= A='$'; fi
expand "$@" |GREP_COLORS=ms= egrep -o "$B.{0,$COLUMNS}$A"
}
这会将制表符转换为空格expand
,然后仅返回$COLUMNS
标准输入或给定文件中文本的第一个零。它支持-r
反转截断,因此您会看到最后的零到$COLUMNS
字符。
(怎么做?grep -o
“仅”显示匹配的内容。扩展的正则表达式^.{0,80}
将仅匹配前 0-80 个字符,而.{0,80}$
仅匹配最后 0-80 个字符。我使用这些范围来确保较短的行仍会显示出来。正则表达式是贪婪的,因此它们会匹配尽可能多的可用内容。)
您可以通过手动设置变量来更改截断的宽度$COLUMNS
。例如,要截断为 72 个字符,请使用COLUMNS=72 trunc FILE
。
此脚本假设每个字符的显示宽度为 1。对于转义符、宽字符或零宽度字符,情况并非如此,因此您可能需要删除 ANSI 转义序列或使用我的完整版 trunc(perl 脚本),使用颜色来标记内容被截断的时间并保留颜色(测量宽度时会跳过它们的控制代码)。它还支持-m
跳过中间的内容。
答案4
创建一个名为 nowrap 的脚本然后......
some_command | nowrap
建议脚本:-
#!/usr/bin/perl -w
my $cols=`/bin/tput cols`; chomp $cols;
while(<>){
chompnl($_); my $tmp=$_; my $add=0;
while($tmp=~/(.*?)(\033\[[\d\;]+m)(.*)/) {
$add+=length($2) if(length($1)<$cols);
$tmp=$1 . $3;
}
while($tmp=~/(.*?)\t(.*)/) {
my $spc=8-(length($1) % 8);
$tmp=$1 . ( ' ' x $spc ) . $2;
$add-=($spc-1);
}
print substr($_,0,$cols+$add) . "\n";
}
# chomp() on unix doesn't eat "\r"...
sub chompnl { # Warning: don't stuff up $1
chop $_[0] while((substr($_[0],-1) eq "\015")||(substr($_[0],-1) eq "\012"));
} # chompnl