如何在Unix shell脚本中从字符串中剪切空格

时间:2015-05-16 06:51:02

标签: bash shell unix

我正在阅读一个文件并根据某些逻辑切割一列。我的问题是我无法用空格剪​​切一列。

这是测试代码 -

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

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

3 个答案:

答案 0 :(得分:5)

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

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

最好使用$(...)而不是旧式的后退来进行命令替换。

答案 1 :(得分: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
||

答案 2 :(得分:-1)

在打印之前保护您的变量:

echo "$HardErrorCheckColumnValue"

如果没有引用,它会扩展为echo mls k,同时将其扩展为echo " mls k"

但正如@Mat指出的那样,伤害已经完成了。所以请参阅@anubhava回答:)