Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何对多行上的字符串正确使用printf?_Bash_Printf - Fatal编程技术网

Bash 如何对多行上的字符串正确使用printf?

Bash 如何对多行上的字符串正确使用printf?,bash,printf,Bash,Printf,使用存储了一些数据的文件,我想读入这些文件并在其他文件中打印5行与模式匹配的特定行。但是,如果文件没有被更正,我想打印5行,其中包含任何消息(“错误”例如),以区分和知道哪个文件是好的或不好的 我是这样做的: if grep -q 'PATTERN' outputfile; then grep --color 'ANOTHER_PATTERN' outputfile > tmpfile else printf 'ERROR %.0s\n' {1..5} &

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

我是这样做的:

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
用于打印字符串,
\n
用于换行,但我不知道为什么需要使用
.0s
。我想在“ERROR”旁边打印一个空格而不是数字(1,2..5)是一个“技巧”,因为如果我只使用
%s\n{1..5}
我获得:

ERROR 1
ERROR 2 
...

一直到5点。我的第二个问题是:如果不使用此选项,如何打印带有
错误
消息的5行?谢谢你的建议

Printf变量的形式如下:

%[parameter$][flags][width][.precision][length]type
  • 精度:整数最小字符串长度、小数点后的最大浮点数或字符串中的最大字符数。前缀为
因此,
.0s
打印字符串的0个字符,忽略它

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

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

Printf变量的形式如下:

%[parameter$][flags][width][.precision][length]type
  • 精度:整数最小字符串长度、小数点后的最大浮点数或字符串中的最大字符数。前缀为
因此,
.0s
打印字符串的0个字符,忽略它

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

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

如果收到的参数多于指定的格式,则格式字符串将重复,直到没有更多参数为止

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

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

printf 'ERROR %.s\n' _ _ _ _ _ > tmpfile
或者使用重定向到tmpfile的显式循环

for i in _ _ _ _ _; do echo 'ERROR'; done >tmpfile
printf
方法是最有效的,因为它只执行一个Bash语句,而不是使用for循环执行多个Bash语句


请记住,Bash没有JIT编译器,因此它在循环中每次都要分析每个命令。

如果收到的参数多于指定的格式,则格式字符串将重复,直到没有更多的参数为止

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

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

printf 'ERROR %.s\n' _ _ _ _ _ > tmpfile
或者使用重定向到tmpfile的显式循环

for i in _ _ _ _ _; do echo 'ERROR'; done >tmpfile
printf
方法是最有效的,因为它只执行一个Bash语句,而不是使用for循环执行多个Bash语句


记住Bash没有JIT编译器,所以它在循环中每次都解析每个命令。

我考虑过for循环是的,但我想了解这个“printf”命令。谢谢你的帮助和解释!:)@Pierre LouisLEFEBVRE,如果这些答案中的一个解决了你的问题,请考虑通过点击投票图标上的灰色复选标记来接受它。它会将问题标记为已解决,这样其他人就不会在问题上花费更多的时间,您将获得一些堆栈溢出点。我考虑过for循环是的,但我想了解这个“printf”命令。谢谢你的帮助和解释!:)@Pierre LouisLEFEBVRE,如果这些答案中的一个解决了你的问题,请考虑通过点击投票图标上的灰色复选标记来接受它。它会将问题标记为已解决,这样其他人就不会在问题上花费更多的时间,您将获得一些堆栈溢出点。是的,像这样可能更容易。我会选择echo选项。非常感谢:)
seq
在POSIX规范中不存在。如果想在shell中调用一种可移植的计数方法(仅依赖标准的强制功能),那么最终会得到类似
i=0;而[“$i”-lt 10];做i=$((i+1));done
@CharlesDuffy确实
seq
是GNU CoreUtils,而不是POSIX。我把它从我的答案中删除了。是的,像这样可能更容易。我会选择echo选项。非常感谢:)
seq
在POSIX规范中不存在。如果想在shell中调用一种可移植的计数方法(仅依赖标准的强制功能),那么最终会得到类似
i=0;而[“$i”-lt 10];做i=$((i+1));done
@CharlesDuffy确实
seq
是GNU CoreUtils,而不是POSIX。我把它从我的答案中删除了。“错误”一词旁边的空白空间是在字符串<代码>错误%.0s/COD>中的“错误”字之后放置的空间。字符串
%.0s
是一种告诉您如何打印字符串(
s
)的格式。
.0
部分说明应打印字符串的多少个字符。在这种情况下是零。请参见
man printf
man 3 printf
单词“ERROR”旁边的空格来自字符串
ERROR%.0s中“ERROR”之后的空格。字符串
%.0s
是一种告诉您如何打印字符串(
s
)的格式。
.0
部分说明应打印字符串的多少个字符。在这种情况下是零。请参见
man printf
man 3 printf