防止 cut 命令中出现换行符

19

是否可以在没有换行符的情况下截取字符串?

printf 'test.test'输出test.test,并且没有换行符。

但是,如果我使用printf 'test.test' | cut -d. -f1截取输出,则test后面会有一个换行符。


1
我看到你对一个更通用的问题进行了评论,最好更新问题并说明你想要做什么。 - fedorqui
3个回答

19

有很多方法。除了isedev和fedorqui的答案之外,您还可以:

  • perl -ne '/^([^.]+)/ && print $1' <<< "test.test"
  • cut -d. -f1 <<< "test.test" | tr -d $'\n'
  • cut -d. -f1 <<< "test.test" | perl -pe 's/\n//'
  • while read -d. i; do printf "%s" "$i"; done <<< "test.test"

注:保留原文中的html标签。

非常全面!+1 在 tr -d 中使用 $'\n' 是必要的吗?对我来说,tr -d '\n' 工作得很好。 - fedorqui
1
@fedorqui 嗯,显然不是这样的。我记得它曾经是这样的,但我可能记错了。也许这取决于 tr 的实现方式。出于习惯,我是这样做的。 - terdon
tr -d $'\n' 中的 $(美元符号)是什么意思? - AlikElzin-kilaka
@AlikElzin-kilaka,GNU tr(Linux机器上的那个)不需要,但其他系统可能需要。这是一种转义方式,有些程序无法处理反斜杠转义(例如\n\t等),因此我们需要以这种方式传递它们。例如,比较echo \necho $'\n' - terdon
$'\n'是Bash字符串,其中转义序列已经展开(以$'开头,以'结尾),包含一个单独的换行符\n。这些字符串的工作方式就像echo -e一样。或者,您可以打开普通的shell字符串,按下<Enter>键,然后关闭字符串,但这样会不够简洁。 - Krzysztof Jabłoński

6

如果您不必使用cut命令,可以使用awk来达到同样的效果:

printf 'test.test' | awk -F. '{printf($1)}'

谢谢!一开始我使用了 awk 'NR==3 {printf "WiFi Signal Strength = " $3*10/7}' /proc/net/wireless | cut -d. -f1; printf "%%\n" ,但是 cut 命令导致了换行,所以我寻求解决方案。无论如何,如果能够用一个 awk 命令更简单地解决它,我会更倾向于这种方法!(例如 awk 'NR==3 {print "WiFi Signal Strength = " $3*10/7 "%"}' /proc/net/wireless 并在小数点后面截断 $3*10/7 的输出) - miu
1
如何看待这段代码:printf("WiFi 信号强度 = %.0f%%",$3*10/7)(最后的 %% 对应于 awk 代码中的“%”)。 - isedev
你应该真正接受@fedorqui的答案 - 它符合实际发布的问题。我发布我的答案只是为了教育目的可能是一个替代方案。 - isedev
你说得对!但无论如何:非常感谢!这就是我在寻找的。 :)(最终命令:awk 'NR==3 {printf("WiFi信号强度 = %.0f%%\n",$3*10/7)}' /proc/net/wireless - miu
@gummiflummi,您还可以使用printf“%d”,$3 * 10/7来获取整数。如果可以的话,您也可以发布另一个问题,以便为isedev获得应得的积分。 - fedorqui

5
我不知道。 man cut 相当简短,没有体现任何类似的内容。
相反,您可以将 cut 输出与 printf 和一个here-string 一起使用,这样新行问题再次取决于 printf
printf '%s' $(cut -d. -f1 <<< "test.test")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接