如何在Unix shell脚本中从字符串中截取空格

3

我正在阅读一个文件并基于一些逻辑来剪切一列。我的问题是我无法剪切带空格的列。

以下是测试代码 -

st="1|alalhabad|up|tushar|kesarwani|90|   mls   k|19990|india|420|24|m"
HardErrorCheckColumnValue=`echo $st | cut -d'|' -f7`
echo $HardErrorCheckColumnValue

输出应该是 -
   mls   k

但是我遇到了一些问题-
mls   k

如何使其不修剪前导或尾随空格?即使只包含空格,它也应该保留空格。


1
你是指前导空格,对吧? - AdrieanKhisbe
请使用 $(…) 而不是反引号。在变量中需要考虑空格时,请使用双引号。此外,根据您所展示的脚本,我认为您的输出不会包括 sk 之间超过一个空格。 - Jonathan Leffler
谢谢 $(..)。我是Unix新手,所以不知道这个 :) - Tushar Kesarwani
3个回答

5

你必须在变量周围使用引号:

HardErrorCheckColumnValue=$(echo "$st" | cut -d'|' -f7)
echo "$HardErrorCheckColumnValue"
   mls   k

最好使用$(...)而不是旧式的反引号进行命令替换。

我是新来的,需要15个声望才能做到那一点。我一定会做到的。谢谢 :) - Tushar Kesarwani

1
awk会帮助你完成这个任务。
$ cat file.dat
1|alalhabad|up|tushar|kesarwani|90|  mls ki |19990|india|420|24|m

$ awk -F"|" '{print "|"$7"|"}' file.dat
|  mls ki |
||

编辑2

如果你在那里输出st变量,就会出现一些空格消失的问题:

检查一下差异:

$ st="1|alalhabad|up|tushar|kesarwani|90|   mls   k|19990|india|420|24|m"

$ echo $st
1|alalhabad|up|tushar|kesarwani|90| mls k|19990|india|420|24|m  <-- ONE SPACE GONE

$ cat file.dat
1|alalhabad|up|tushar|kesarwani|90|  mls ki |19990|india|420|24|m

$ awk -F"|" '{print "|"$7"|"}' file.dat
|  mls ki |  <---- SPACE OK
||

损坏就是回声...但它在谈论修剪所有空格...请尝试一下... - Alejandro Teixeira Muñoz
Mac-mini-de-Alejandro:~ ouchito$ awk -F"|" '{print "|"$7"|"}' file.dat | mls ki | || - Alejandro Teixeira Muñoz
1
或者 echo "$st" 也可以(当你有 st="1|alalhabad|up|tushar|kesarwani|90| mls k |19990|india|420|24|m")——关键是 echo 不能有机会搞砸空格。 (哦,还有,在注释中的 Markdown 即使在代码片段中也会删除多个空格,这很令人震惊,但生活有时是不公平的。) - Jonathan Leffler
我个人不喜欢那里的回显...这就是为什么我尝试了不同的方法(使用文件)并看到了差异...对于格式不好的问题,抱歉,我没有注意到我写了两个不同的东西,然后空格不正确导致结果不好。 - Alejandro Teixeira Muñoz

-1

在打印变量之前保护它:

echo "$HardErrorCheckColumnValue"

没有引号时,它会扩展为echo mls k,而有引号时则会扩展为echo " mls k"

但正如@Mat所指出的那样,已经造成了损害。因此请参考@anubhava的答案 :)


3
这里不够充分,那行之前已经造成了损害。 - Mat
是的... @Anubhava 的答案对我很有效。所以当空格有影响时,引号是必需的。很棒! - Tushar Kesarwani

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