![如何将多行字符串修剪为最多 n 行](https://linux22.com/image/202554/%E5%A6%82%E4%BD%95%E5%B0%86%E5%A4%9A%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BF%AE%E5%89%AA%E4%B8%BA%E6%9C%80%E5%A4%9A%20n%20%E8%A1%8C.png)
我有一个很长的多行输入字符串,位于局部变量 $INPUT 中,例如:
a
b
c
d
e
f
如何将其修剪为最多 n 行,假设 n=3,并在末尾添加一条消息:
a
b
c
... message too long
这就是我所拥有的,不适用于多行:
$OUTPUT=$('$INPUT' | awk '{print substr($0, 1, 15) "...")
答案1
怎么样
output=$(echo "$input" | awk -v n=3 'NR>n {print "... message too long"; exit} 1')
或者
output=$(echo "$input" | sed -e '3{a\... message too long' -e 'q}')
output=$(echo "$input" | sed -e '3{$!N;s/\n.*/\n... message too long/' -e 'q}')
POSIXly
output=$(echo "$input" | sed -e '3{
$!N
s/\n.*/\n... message too long/
q
}')
或使用 GNU sed:
output=$(echo "$input" | sed -e '4{i\... message too long' -e 'Q}')
答案2
OUTPUT=$(echo "$INPUT" | perl -pe '1..3 or exit')
答案3
我建议这样:
# convert the variable into an array
$ mapfile -t arr < <(echo "$INPUT")
# use printf and slice the array into the fisrt three elements
$ printf "%s\n" "${arr[@]:0:3}" "... message too long"
a
b
c
... message too long