如何在Unix shell脚本中用空格填充字符串?


3

我有看起来像这样的数据:

01234567
09876544
12345676
34576980

我需要用11个空格填充它,即我的输出应如下所示:

'           01234567' 
'           09876544'
'           12345676'
'           34576980'

如何使用UNIX Shell脚本来做到这一点?


1
您的输入是否真的像这样一行显示?有多少个领域?只有两个或更多?这是在文本文件中,并且行多于一行吗?引号和逗号之间的间隔又如何呢?如果您说的是Unix,那么严格来说是指UNIX,还是Linux?什么脚本语言?Bash还可以吗?请编辑并澄清您的问题。也许您可以告诉我们更多有关背景的信息,因为您所要求的似乎有些人为。
slhck

1
实时预览了您的帖子在编辑后的样子。请使用它。
丹尼尔·贝克

Answers:


10

我假设/猜测撇号不应包含在输出中。

标准外壳解决方案,其中infile包含输入的文件在哪里:

while read i; do printf "%19s\n" "$i"; done < infile

其中19是给出的每行的字符串长度(8)加上所需的填充(11)。我再次猜测,这种填充是您想要的,而不仅仅是在所有行前添加11个空格。如果不是这种情况,则需要给出一个具体示例,说明如何处理不同长度的输入行。

如果要包含撇号:

while read i; do printf "'%19s'\n" "$i"; done < infile

3

以下是GNU coreutils中一个较短的选项pr

pr -T -o 11 foo.txt

手册页摘录:

DESCRIPTION
       Paginate or columnate FILE(s) for printing.

       -o, --indent=MARGIN
              offset each line with MARGIN (zero) spaces

       -T, --omit-pagination
              omit page headers and trailers, eliminate any pagination by form feeds set in input files

0

您可以通过就地更改文件来使用Ex-editor(Vi):

ex -s +"%s@^@    @" -cwq foo.txt

或通过解析标准输入并将其打印到标准输出中:

cat foo.txt | ex -s +"%s@^@    @" +%p -cq! /dev/stdin

0

假设数据在文本文件中:

    $ cat file.txt 
    01234567
    09876544
    12345676
    34576980

如下使用sed命令或Perl单行代码:

    $ sed -n "s#^\(.*\)#\'           \1\'#p" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

-n :    By default, each line of input is echoed to the standard output after 
        all of the commands have been applied to it.  The -n option suppresses
        this behavior.
 p :    Print the current pattern space.


    $ perl -p -e "s#^(.*)#\'           \$1\'#" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

−p: Assumes an input loop around the script. Lines are printed.
−e commandline:
May be used to enter a single line of script. Multiple −e commands
build up a multiline script.

我已经在Ubuntu Linux上尝试了这些命令。


-1

这是@Daniel Andersson的答案的补充,如果从文件中读取的每一行的长度不同,则可以执行以下操作:

while read i; do printf "%11s%s\n" "" "$i"; done < infile

为什么会有逗号?
五彩纸屑

请添加一些说明(与其他答案比较)。
斯科特(Scott)

@Scott,丹尼尔·安德森(Daniel Andersson)的答案假定文件的每一行都具有相同的长度(8位数字),因此他使用%19s,如果长度有所不同,我们可以使用%11s%s,对吗?
Tony Guo

@confetti抱歉,这是一个错字,答案已更新
Tony Guo

当提到“填充”时,通常希望输出为固定宽度。例如19个字符。如果输入低于此值,则“填充”通常是指在输入的左侧(或右侧)添加一个空格(或0,或其他值),以实现所需的输出字符长度。
五彩纸屑
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.