如何在多行字符串上正确使用printf?

时间:2019-07-23 20:46:29

标签: bash printf

使用文件中存储了一些数据的文件,我想读入这些文件并在其他文件中打印与模式匹配的5条特定行。但是,如果文件不正确,我想打印5行,其中包含任何消息(例如“ ERROR”),以区分并知道哪个文件是好文件。

这是我的做法:

import pandas as pd 

pd.Series(pd.date_range('today', periods=30, freq='D').normalize(),
          name='Date')

0    2019-07-23
1    2019-07-24
...
28   2019-08-20
29   2019-08-21
Name: Date, dtype: datetime64[ns]

所以,我的问题是命令df['Date'] = pd.date_range('today', periods=len(df), freq='D').normalize() 实际如何工作?该代码实际上在工作,但是我对使用我不完全理解的命令感到不满意。

我知道if grep -q 'PATTERN' outputfile; then grep --color 'ANOTHER_PATTERN' outputfile > tmpfile else printf 'ERROR %.0s\n' {1..5} > tmpfile fi 用于打印字符串,printf 'ERROR %.0s\n' {1..5}用于换行,但是我不知道为什么我们需要使用%s。我猜这是在“错误”旁边而不是数字(1,2 ..,5)旁边打印空白的“技巧”,因为如果我只是使用 \n我获得:

.0s

,依此类推,直到5。我的第二个问题是:如何使用%s\n {1..5}消息打印5行而不使用它?感谢您的建议。

2 个答案:

答案 0 :(得分:1)

Printf变量采用以下形式:

%[parameter$][flags][width][.precision][length]type
  • 精度:整数的最小字符串长度,十进制后的最大浮点数或字符串中的最大字符数。以.
  • 为前缀

因此.0s会打印字符串的0个字符,而忽略它。

如果您真的想打印5次,最基本的方法是for循环

for i in {1..5}; do echo "ERROR"; done

答案 1 :(得分:1)

如果接收到的参数超出了格式指定的数量,则格式字符串将重复直到没有更多的参数为止。

{1..5}生成5个整数参数的序列

您可以编写与以下结果相同的代码:

printf 'ERROR %.s\n' _ _ _ _ _ > tmpfile

或者通过显式循环重定向到tmpfile

for i in _ _ _ _ _; do echo 'ERROR'; done >tmpfile

printf方法效率最高,因为它仅执行一个Bash语句,而不执行多个for循环语句。

Remember Bash没有JIT编译器,因此它在循环中每次都解析每个命令。