【问题标题】:How can I remove a newline (\n) at the end of a string?如何删除字符串末尾的换行符 (\n)?
【发布时间】:2017-05-12 16:22:24
【问题描述】:

问题

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

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

LINES 变量

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

我可以使用任何命令行实用程序(sed、tr、awk,......你的名字)。

尝试

我试过没有用

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

我也对 tr 不满意,因为它不接受正则表达式。

想法

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

来源

我略读了以下问题

【问题讨论】:

标签: string bash replace


【解决方案1】:

这里有一个解决方案:

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

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

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

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

通常不建议对 shell 变量使用大写字母,因为 shell 和操作系统出于自身目的使用大写名称。您的局部变量通常应该是小写的名称。

所以如果我不是根据问题中的命令来回答,我会写:

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

【讨论】:

  • It is not necessary to quote strings in shell assignment statements,那你为什么要引用整件事呢?
  • @123:我正在复制 OP 中的行。
  • 你是什么意思,那行字面上是整个答案,你改变了一些,那为什么要留下引号?
  • @123:这可能是个坏习惯:做最少的必要更改,以便专注于实际是答案的部分。
  • 很公平,只是觉得可能有点混乱。
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 2014-05-14
  • 2016-03-21
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多