2016-01-09 3 views
1

Я изо всех сил пытаюсь записать файл, пока он печатает его вместе с некоторыми словами.Отступ строк одинаково с echo

Например:

/корень/файл содержит:

line1 
line2 
line3 

Сценарий:

#!/bin/bash 
echo -en "Printing Line of the file: `cat /root/file`\n" 

Результат:

Printing Line of the file: line1 
line2 
line3 

Ожидаемый результат:

Printing Line of the file: line1 
          line2 
          line3 

Как я могу получить выходные данные, которые я хочу?

+0

Спасибо. Но он все еще печатает точно так же. Мое ожидание состоит в том, чтобы использовать одно пространство на первой линии, а со второй строки нужно использовать три вкладки –

+0

Является ли формат вывода то, что вам действительно нужно? Человеку или компьютерам не очень легко читать. Что-то вроде 'echo Printing ...; sed 's/^//'/root/file' проще кодировать и легче читать его вывод. – msw

ответ

0

Вы можете использовать существующие утилиты, как это:

myvar="Printing Line of the file: " 
size=${#myvar} 
# getting the right size is the tricky part 
var_final_size=$((size+5)) 
echo -en "${myvar}`awk -F\; -v fmt="%${var_final_size}s\n" '{if (NR==1) {print $1} else {printf fmt, $1}}' test.txt`\n" 

Или вы можете скрипт что-то вроде этого:

#!/bin/bash 
myvar="Printing Line of the file: " 
size=${#myvar} 
var_counter=0 
for r in `cat /root/file` 
do 
    var_size=${#r} 
    var_final_size=$((size+var_size)) 
    if [ $var_counter -eq 0 ]; then 
     printf "%${var_final_size}s\n" "${myvar}${r}" 
    else 
     printf "%${var_final_size}s\n" "${r}" 
    fi 
    var_counter=$((var_counter+1)) 
done 

Выход

Printing Line of the file: line1 
          line2 
          line3 
0
echo -en "Printing Line: `awk '{if (NR==1) {print " "$0} else {print "\t\t\t"$0}}' file`\n" 

Printing Line: line1 
         line2 
         line3 

(Это похоже на работу , хотя он вложен «внутри», возможно, это должно быть print \" \"$0 и аналогично сбежать от них должным образом, я не знаю).

2

Просто баш:

( 
    first="Printing Line of the file:" 
    IFS= 
    read -r line 
    printf "%*s %s\n" ${#first} "$first" "$line" 
    while read -r line; do 
     printf "%*s %s\n" ${#first} "" "$line" 
    done 
) < file 
Printing Line of the file: line1 
          line2 
          line3 

С Printf, вы можете использовать * как ширина поля, а затем предоставить ряд в рассуждениях. Я запускаю это в подоболочке, поэтому изменение IFS не влияет на родительскую оболочку.


Для достижения своей цели с письменной закладками:

echo "Printing Line of the file: $(awk -v ORS="\n\t\t\t" 1 file)" 
0

Следующими печатает построчно - текст справа на 32 символах:

awk '{ printf("%32s\n", $0) }' 

Предполагая одинаковые строки длины .. мы могли бы пик в первой строке, подсчитать символы и установить шаблон для printf на всех строках.

awk 'NR==1 { f = "%" length "s\n" } { printf(f, $0) }' 

Если линии не такой же длины, та же идея может быть использована с Sprintf создать площадку пространств:

awk -v x='Printing Line of the file: ' 'NR==1 { pad = sprintf("%" length(x) "s", ""); print x $0; next } { print pad $0 }' /root/file 
Смежные вопросы