【问题标题】:Bash script file read, bash deletes spacesbash脚本文件读取,bash删除空格
【发布时间】:2014-10-28 05:20:40
【问题描述】:

这个问题是我之前关于读取文件某些行的问题的后续问题。 我读了我的文件如下:

while read line 
do
    if [ "$line" == "SUMMARY OF POLARIZATION CALCULATION" ]; then
        for i in {1..9}
        do
            read line
            echo $line >> ../../Summary.out
        done
        break
    fi
done < ../Tutorial1_1.out

看起来像这样:

.
.
.
 O  (0.0000, 0.5000, 0.4834)  sp(1)  6.00 [ 0.000000e+00,  1.884956e+01,  1.822516e+01]
---------------------------------------------------------------------------------------
Total ionic phase (rad)       sp(1)       [ 7.539822e+01,  7.539822e+01,  1.119960e+02]
Total ionic phase wrap. (rad) sp(1)       [ 8.633172e-11,  8.633172e-11, -1.101384e+00]
Ionic polarization (C/m2)     sp(1)       [ 1.365657e-11,  1.365657e-11, -1.760570e-01]
=======================================================================================

SUMMARY OF POLARIZATION CALCULATION
=======================================================================================
Value                           |  spin   |    dir(1)    |    dir(2)    |    dir(3)
---------------------------------------------------------------------------------------
Electronic polarization (C/m2)     sp(1)  [-8.783054e-12, -8.828765e-13,  4.803326e-01]
Ionic polarization (C/m2)          sp(1)  [ 1.365657e-11,  1.365657e-11, -1.760570e-01]
Tot. spin polariz.=Pion+Pel (C/m2) sp(1)  [ 4.873517e-12,  1.277369e-11,  3.042756e-01]
---------------------------------------------------------------------------------------
TOTAL POLARIZATION (C/m2)          both   [ 4.873517e-12,  1.277369e-11,  3.042756e-01]
=======================================================================================

Completed using BerryPI version: +++Version 1.2 (Mar 12, 2014)
...

所以上面的代码只取“SUMMARY..”后面的 9 行并写入 Summary.out 文件。但是,当它写入时,它会搞砸所有间距,所以我得到以下信息:

=======================================================================================
Value | spin | dir(1) | dir(2) | dir(3)
---------------------------------------------------------------------------------------
Electronic polarization (C/m2) sp(1) [-8.783054e-12, -8.828765e-13, 4.803326e-01]
Ionic polarization (C/m2) sp(1) [ 1.365657e-11, 1.365657e-11, -1.760570e-01]
Tot. spin polariz.=Pion+Pel (C/m2) sp(1) [ 4.873517e-12, 1.277369e-11, 3.042756e-01]
---------------------------------------------------------------------------------------
TOTAL POLARIZATION (C/m2) both [ 4.873517e-12, 1.277369e-11, 3.042756e-01]
=======================================================================================

我该如何解决这个问题,是否有一个标志可以完全按照输入文件中的内容读取和写入字符串?

【问题讨论】:

    标签: string bash file


    【解决方案1】:

    我建议使用

    echo "$line" >> ../../Summary.out
    

    而不是

    echo $line >> ../../Summary.out
    

    【讨论】:

    • 如果我理解这一点,请告诉我。没有“”,字符串变量被视为一个数组,其中只打印非空元素,而“”则将其视为字符串?
    • 最好不要将其视为一个数组(因为bash 也有数组)。相反,将$line 视为一个宏。字符串$line 被变量line 的内容替换,就像echo a b 将简单地打印a b(多个空格替换为一个空格),所以echo $line 将处理任何运行的空格$line 作为简单的字段分隔符,每个字段之间打印一个空格。
    • 但是,为了同时保留前导和尾随空格,您需要使用IFS= read 而不仅仅是read,并引用$line 的扩展名。
    • 区别在于shell如何将参数传递给echo命令。当您不在$line 周围使用引号时,将评估此变量并将结果作为一个或多个参数传递给echo。当您引用变量时,它将评估并且结果将作为单个参数传递给echo。因此,当您执行$line = 'a b c'; echo $line echo 命令时,将获得 3 个参数。但是,如果您在 $line 周围添加引号,则 echo 将仅获得一个参数(并且将保留空格)。
    猜你喜欢
    • 2014-10-26
    • 2021-01-26
    • 2021-01-17
    • 1970-01-01
    • 2022-05-30
    • 1970-01-01
    • 2010-12-30
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多