【问题标题】:Remove Leading Spaces from a variable in Bash从 Bash 中的变量中删除前导空格
【发布时间】:2017-04-05 05:39:16
【问题描述】:

我有一个脚本,可以将 XML 文件导出到我的桌面,然后提取“id”标签中的所有数据并将其导出到 csv 文件。

xmlstarlet sel -t -m '//id[1]' -v . -n </users/$USER/Desktop/List.xml > /users/$USER/Desktop/List2.csv

然后我使用以下命令在每个数字后添加逗号并将其存储为变量。

 devices=$(sed "s/$/,/g" /users/$USER/Desktop/List2.csv)

如果我回显该变量,我会得到如下所示的输出:

123,
124,
125,

等等。

我需要帮助的是删除这些空格,以便输出看起来像没有前导空格的 123,124,125。我尝试了多种我无法工作的解决方案。任何帮助都会很棒!

【问题讨论】:

    标签: bash sed spaces


    【解决方案1】:

    如果您不想要换行符,请不要告诉xmlstarlet 将它们放在首位。

    也就是说,将-n 更改为-o , 以在每个值之后放置一个逗号而不是换行符:

    { xmlstarlet sel -t -m '//id[1]' -v . -o ',' && printf '\n'; } \
      <"/users/$USER/Desktop/List.xml" \
      >"/users/$USER/Desktop/List2.csv"
    

    这里的printf '\n' 在 xmlstarlet 完成其输出写入后在 CSV 文件的末尾放置一个最后的换行符。

    如果您不希望在输出文件中留下结尾的,,最简单的摆脱它的方法是将xmlstarlet 的结果读入一个变量并在那里进行操作:

    content=$(xmlstarlet sel -t -m '//id[1]' -v . -o ',' <"/users/$USER/Desktop/List.xml")
    printf '%s\n' "${content%,}" >"/users/$USER/Desktop/List2.csv"
    

    【讨论】:

    • 谢谢!第二个命令是我真正需要的。我没有意识到我犯了这么愚蠢的错误:/
    【解决方案2】:

    对于 sed 解决方案,请尝试

    sed ':a;N;$!ba;y/\n/,/' /users/$USER/Desktop/List2.csv
    

    或者如果你想在最后一个逗号之后加逗号:

    sed ':a;N;$!ba;y/\n/,/;s/$/,/' /users/$USER/Desktop/List2.csv
    

    但这样会更容易

    cat /users/$USER/Desktop/List2.csv | tr "\n" ","
    

    【讨论】:

    • 谢谢!这实际上非常有用,它可以很好地消除尾随:)
    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多