我有这样的命令行:
xclip -o -sel clip | sed -e 's/^ *"\(.*\)"+\?/\1/g' | tr -d '\n' |
sed -e 's/.\{,55\}/"&"+\n/g' |
sed -e "2,$ s/^/$(seq 22 | xargs -I{} echo -n ' ')/" |
sed -e '$ s/+$//' | xclip -sel clip
源代码中的格式字符串(我用它来格式化 javascript 文件中的长字符串 - 55 和 22 是硬编码宽度和缩进)
var foo = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"+
". Nulla sed dolor nisl, in suscipit justo. Donec a enim"+
" et est porttitor semper at vitae augue. Proin at nulla"+
" at dui mattis mattis. Nam a volutpat ante. Aliquam con"+
"sequat dui eu sem convallis ullamcorper."
但是当我在括号内复制过去的代码时 var foo = foo.bar()
我明白了
var foo = foo.bar("Lorem ipsum dolor sit amet, consectetur adipiscing elit"+
". Nulla sed dolor nisl, in suscipit justo. Donec a enim"+
" et est porttitor semper at vitae augue. Proin at nulla"+
" at dui mattis mattis. Nam a volutpat ante. Aliquam con"+
"sequat dui eu sem convallis ullamcorper."
)
最后一个引号后的新行,没什么大不了的,但有人知道我怎样才能删除最后一个新行吗?
最佳答案
这是一种方法,使用 awk
。将 RS
(记录分隔符)设置为空字符串告诉 awk
将空行(即两个连续的 \n
)视为记录分隔符。将 FS
设置为 \n
会导致 awk
将 \n
作为字段分隔符而不是空格。 (将 RS
设置为空字符串也会导致 \n
被用作字段分隔符,但我们希望避免识别其他空格。)最后,我们设置 OFS
(输出字段分隔符)是我们想要的行间字符串(结束引号、加号、换行符、22 个空格、开始引号)并将 ORS
(输出记录分隔符)设置为空字符串导致 awk
不在末尾写入任何换行符。
我使用 fold
将行拆分为 55 字节的 block 而不是 sed,部分原因是它看起来更整洁,部分原因是,与 sed
不同,它不会如果没有开始的话,在输入的末尾添加一个新行。
看似多余的$1=$1
导致awk
重新创建$0
,起到了使用OFS
的作用作为字段之间的输出字段分隔符。否则,它仅用于分隔单独的打印参数。
第一行和最后一行与 OP 相同。
xclip -o -sel clip | sed -e 's/^ *"\(.*\)"+\?/\1/g' | tr -d '\n' |
fold -b -w55 |
awk -vFS=$'\n' -vOFS="$(printf '"+\n%22s"' '')" \
-vRS='' -vORS='' \
'{$1=$1; print "\"" $0 "\""}' |
xclip -sel clip
关于linux - 如何从命令行中删除流中的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452043/