我想在另一个脚本中调用 shell 脚本/应用程序。所包含脚本的每一行都应缩进 2 个空格。这可能吗?
输出看起来应该像这样。
I'm the main-scripts' output.
I'm a second script, called inside the main-script.
Every line of my output is indented by 2 spaces.
This is not implemented inside of me, but in the main-script
as I should also be called outside of the main-script and then
my output shouldn't be indented.
Thats all from the second script.
这可能吗?如何实现?
答案1
您可以使用sed
或awk
来执行此操作。例如,在主脚本中您可以执行以下操作:
# execute the command and pipe to sed
second-script | sed 's/\(.*\)/ \1/'
上述sed
命令只是在输出的每一行前面添加了两个空格second-script
。
答案2
与 Unix 中其他所有系统一样,这里也有选项。
paste
使用该paste
实用程序和一个空白的 LHS 文件,例如:
cat ~/.bashrc | paste /dev/null -
该cat
命令是第二个脚本的占位符。
该paste
命令用于将两个文件放在一起,例如:
$ paste file1 file2
file 1 line 1 <TAB> file 2 line 1
file 1 line two <TAB> file 2 line 2
file 1 line 3 <TAB> file 2 line iii
我上面使用它的方式是使用/dev/null
和file1
,STDIN
由file2
指定-
。用作输入时,/dev/null
返回 NULL 字符。这意味着 的每一行file2
(第二个脚本的输出)前面都有 NULL,后面跟着一个 TAB 字符。
您可以更进一步:paste
有一个--delimiter
选项,但指定两个空格并不能达到预期的效果:分隔符 1用于第一列和第二列之间,分隔符 2用于第二个和第三个之间,依此类推。
paste|expand
要获得两个空格的缩进,您可以paste
再次使用普通管道expand -2
:这会将所有制表符变成两个空格:
cat ~/.bashrc | paste /dev/null - | expand -2
这将完全按照您指定的方式运行。
sed
或者awk
另一种方法是使用sed
或awk
:
cat ~/.bashrc | sed 's/^/ /'
这将搜索行首(“ ^
”),然后替换或实际插入一对空格。
cat ~/.bashrc | awk '{printf " %s\n",$0}'
这将获取每个整行(“ $0
”)并使用 进行格式化printf
,使用两个空格的格式说明符,后跟要打印的字符串,后跟换行符。
请记住,上述所有命令都可以消除cat
管道的一部分,即paste /dev/null ~/.bashrc
,或paste /dev/null ~/.bashrc|expand -2
,同样sed 's/^/ /' ~/.bashrc
或。在管道中awk '{printf " %s\n",$0}' ~/.bashrc
使用 first 通常被认为是初学者的错误。cat