如何截断长度超过给定长度的文本行?

und*_*har 21 string bash shell truncation string-length

您将如何删除x个字符之后的所有内容?例如,删除 15 个字符之后的所有内容并添加...到其中。

This is an example sentence应该变成This is an exam...

Léa*_*ris 28

GnuToolshead可以使用字符而不是行:

\n
head -c 15 <<<\'This is an example sentence\'\n
Run Code Online (Sandbox Code Playgroud)\n

尽管考虑到head -c只处理字节,所以这与 UTF-8 变音等多字节字符不兼容\xc3\xbc

\n

Bash 内置字符串索引的工作原理:

\n
str=\'This is an example sentence\'\necho "${str:0:15}"\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
This is an exam\n
Run Code Online (Sandbox Code Playgroud)\n

最后是一些可以与 ksh、dash、zsh\xe2\x80\xa6 一起使用的东西:

\n
printf \'%.15s\\n\' \'This is an example sentence\'\n
Run Code Online (Sandbox Code Playgroud)\n

甚至以编程方式:

\n
n=15\nprintf \'%.*s\\n\' $n \'This is an example sentence\'\n
Run Code Online (Sandbox Code Playgroud)\n

如果您使用的是 Bash,则可以直接将 的输出分配printf给变量并使用以下命令保存子 shell 调用:

\n
trim_length=15\nfull_string=\'This is an example sentence\'\nprintf -v trimmed_string \'%.*s\' $trim_length "$full_string"\n
Run Code Online (Sandbox Code Playgroud)\n

  • `${str:0:15}` 非常好,谢谢! (2认同)

Boh*_*ian 11

使用sed

echo 'some long string value' | sed 's/\(.\{15\}\).*/\1.../'
Run Code Online (Sandbox Code Playgroud)

输出:

some long strin...
Run Code Online (Sandbox Code Playgroud)

该解决方案的优点是短字符串不会...添加尾部:

echo 'short string' | sed 's/\(.\{15\}\).*/\1.../'
Run Code Online (Sandbox Code Playgroud)

输出:

short string
Run Code Online (Sandbox Code Playgroud)

因此,它是适用于所有尺寸输出的一种解决方案。


小智 8

使用cut

echo "This is an example sentence" | cut -c1-15
This is an exam
Run Code Online (Sandbox Code Playgroud)

这包括字符(处理多字节字符)1-15,参见cut(1)

     -b, --bytes=LIST
            select only these bytes

     -c, --characters=LIST
            select only these characters
Run Code Online (Sandbox Code Playgroud)