Use Bash to read line by line and keep space

后端 未结 6 862
感情败类
感情败类 2020-11-28 05:00

When I use \"cat test.file\", it will show

1
 2
  3
   4

When I use the Bash file,

cat test.file |
while read data
do
    e         


        
相关标签:
6条回答
  • 2020-11-28 05:20

    Alternatively, use a good file parsing tool, like AWK:

    awk '{
      # Do your stuff
      print 
    }' file
    
    0 讨论(0)
  • 2020-11-28 05:26
    IFS=''
    cat test.file |
    while read data
    do
        echo "$data"
    done
    

    I realize you might have simplified the example from something that really needed a pipeline, but before someone else says it:

    IFS=''
    while read data; do
        echo "$data"
    done < test.file
    
    0 讨论(0)
  • 2020-11-28 05:27

    Just to complement DigitalRoss's response.

    For that case that you want to alter the IFS just for this command, you can use curly braces. If you do, the value of IFS will be changed only inside the block. Like this:

    echo '
      word1
      word2' |  { IFS='' ; while read line ; do echo "$line" check ; done ; }
    

    The output will be (keeping spaces):

      word1 check
      word2 check
    
    0 讨论(0)
  • 2020-11-28 05:27

    read data will split the data by IFS, which is typically " \t\n". This will preserve the blanks for you:

    var=$(cat test.file)
    echo "$var"
    
    0 讨论(0)
  • 2020-11-28 05:30

    Actually, if you don't supply an argument to the "read" call, read will set a default variable called $REPLY which will preserve whitespace. So you can just do this:

    $ cat test.file | while read; do echo "$REPLY"; done
    
    0 讨论(0)
  • 2020-11-28 05:37

    Maybe IFS is the key point as others said. You need to add only IFS= between while and read.

    cat test.file | 
    while IFS= read data 
     do echo "$data"
     done
    

    and do not forget quotations of $data, else echo will trim the spaces.

    But as Joshua Davies mentioned, you would prefer to use the predefined variable $REPLY.

    0 讨论(0)
提交回复
热议问题