如何从命令行中删除流中的最后一个新行

时间:2012-09-17 01:02:16

标签: linux bash sed newline

我有命令行:

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."
)

最后一句话之后的新行,不是什么大不了的事,但有人知道如何删除最后一行?

1 个答案:

答案 0 :(得分:3)

这是使用awk执行此操作的一种方法。将RS(记录分隔符)设置为空字符串会使awk将空行(即两个连续的\n)视为记录分隔符。将FS设置为\n会导致awk\n作为字段分隔符而不是空格。 (将RS设置为空字符串也会导致\n用作字段分隔符,但我们希望避免识别其他空格。)最后,我们设置OFS(输出字段分隔符) )成为我们想要的行之间的字符串(结束引号,加号,换行,22个空格,打开引号)并将ORS(输出记录分隔符)设置为空字符串会导致awk不写任何换行符最后。

我使用fold将行分成55个字节的块而不是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