缩短行,添加“...”省略号

Vol*_*gel 9 text-processing

如何剪掉比某个宽度长的线条,并用省略号标记被剪掉的线条?

只应标记实际缩短的行,而不是最初具有正确长度的行。

我想在管道中使用该命令。

Mar*_*ick 15

这将截断字符串,砍掉额外的三个字符,如果长度比您作为参数提供的值长,则添加“...”。

other_programs | \
awk -v len=40 '{ if (length($0) > len) print substr($0, 1, len-3) "..."; else print; }'
Run Code Online (Sandbox Code Playgroud)


mur*_*uru 9

尝试这个:

awk -F '' '{if (NF > 70) {print substr($0, 0, 71)"..."} else print $0}'
Run Code Online (Sandbox Code Playgroud)

如果NF太高,更简单的方法:

awk '{if (length($0) > 70) {print substr($0, 0, 71)"..."} else print $0}'
Run Code Online (Sandbox Code Playgroud)

或更短的版本:

awk 'length > 70{$0=substr($0,0,71)"..."}1'
Run Code Online (Sandbox Code Playgroud)

  • 如果长度大于最大“NF”,这将在“awk”的某些实现中导致错误。例如,`mawk` 的最大值为 `NF` 32767。 (3认同)

ste*_*ver 5

一些可能性:

whereN是您希望用省略号替换的字符数。


Eli*_*gan 5

awk正如其他答案中所介绍的,sed、 、 和perl,擅长文本处理,并且可能是完成这项工作的最佳工具。

但如果您愿意,您也可以纯粹地执行此操作bash(即“不离开外壳”):

n=70
while read -r; do
    if ((${#REPLY}<=n))
        then printf '%s\n' "$REPLY"
        else printf '%s...\n' "${REPLY:0:$((n-3))}"
    fi
done < filename
Run Code Online (Sandbox Code Playgroud)

替换70为所需的最大长度和filename输入文件。

要在管道的右侧使用它(即,将另一个命令的输出通过管道传输到它),请删除并预先设置或将整个内容包含在:< filenamen{ ... ;}

{ n=70
while read -r; do
    if ((${#REPLY}<=n))
        then printf '%s\n' "$REPLY"
        else printf '%s...\n' "${REPLY:0:$((n-3))}"
    fi
done ;}
Run Code Online (Sandbox Code Playgroud)

(这个括号括起来的版本在其他上下文中也可以正常工作,包括上面的重定向。在该用例中括号是不必要的,但没有害处。)

这看起来像:

ek@Ilex:~$ help read | head -5 | { n=70
> while read -r; do
>     if ((${#REPLY}<=n))
>         then printf '%s\n' "$REPLY"
>         else printf '%s...\n' "${REPLY:0:$((n-3))}"
>     fi
> done ;}
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N n...
    Read a line from the standard input and split it into fields.

    Reads a single line from the standard input, or from file descr...
    if the -u option is supplied.  The line is split into fields as...
Run Code Online (Sandbox Code Playgroud)

请注意,与迄今为止提出的其他解决方案一样,在存在显示超过一列宽度的字符(例如水平制表符)的情况下,这将无法完美地限制输出宽度。