如何在字符串末尾删除换行符(\ n)?

时间:2017-05-12 16:22:25

标签: string bash replace

问题

我在一个字符串中有多个属性行,由\n分隔,如下所示:

LINES2="Abc1.def=$SOME_VAR\nAbc2.def=SOMETHING_ELSE\n"$LINES

LINES变量

  • 可能包含一组未定义的字符
  • 可能是空的。如果它是空的,我想避免尾随\n

我打开任何命令行实用程序(sed,tr,awk,......你的名字)。

Tryings

我试过这个无济于事

sed -z 's/\\n$//g' <<< $LINES2

我也没有运气 tr ,因为它不接受正则表达式。

可能有一种方法可以将\n转换为其他内容。但由于$LINES可以包含任意字符,因此这可能很危险。

来源

我浏览了以下问题

1 个答案:

答案 0 :(得分:1)

这是一个解决方案:

LINES2="Abc1.def=$SOME_VAR"$'\n'"Abc2.def=SOMETHING_ELSE${LINES:+$'\n'$LINES}"

如果变量${name:+value}存在且不为空,则语法value表示“插入name”。因此,在这种情况下,如果$LINES不为空,则会插入换行符后跟$LINES,这似乎正是您想要的。

我使用$'\n'因为"\n"不是换行符。更可读的解决方案是定义一个shell变量,其值为单个换行符。

没有必要在shell赋值语句中引用字符串,因为赋值的右侧不会进行分词,也不会进行全局扩展。不引用会更容易插入$'\n'

通常不建议对shell变量使用UPPER-CASE,因为shell和OS使用大写名称用于它们自己的目的。您的局部变量通常应为小写名称。

因此,如果我不是根据问题中的命令得出答案,我会写:

lines2=Abc1.def=$someVar$'\n'Abc2.def=SOMETHING_ELSE${lines:+$'\n'$lines}