2016-07-07 4 views
1

Известный SED команды, чтобы извлечь первую строку и напечатать другой файлКак напечатать некоторый свободный текст в дополнение к СЭД экстракт

sed -n '1 p' /p/raw.txt | cat >> /p/001.txt ; 

дает выход в /p/001.txt как

John Doe 

Но как изменить эту команду выше, чтобы добавить свободный текст и иметь, например, выход, как

Name: John Doe 

Спасибо за любой намек попробовать.

ответ

3

Вы можете сделать это в одной команде (и без каких-либо вспомогательных оболочек):

sed 's/^/Name: /;q' /p/raw.txt >> /p/001.txt 

Это префиксы «Имя:» перед первой линии, печатает его, а затем завершает работу таким образом Вы не Не обрабатывайте дополнительные строки. Добавьте номер строки до q, чтобы распечатать все строки до (и включая) этого номера. Результат добавляется к /p/001.txt точно так же, как ваш исходный код.

Если вы хотите диапазон строк:

sed -n '3,9{s/^/Name: /;p}9q' /p/raw.txt >> /p/001.txt 

Это читает строки 3-9, выполняет замену, отпечатки, а затем завершает работу после строки 9.

Если вы хотите, чтобы определенные строки, я рекомендуем awk:

awk 'NR==3 || NR==9 { print "Name: " $0 } NR>=9 { exit }' /p/raw.txt >> /p/001.txt 

У этого есть два предложения. Один говорит, что число записей (номер строки) равно 3 или 9, и в этом случае мы печатаем префикс и строку. Другой говорит нам прекратить чтение файла после 9-й записи.

Вот еще две команды, чтобы показать, как AWK могут действовать только на первой линии (ы) или в заданном диапазоне:

awk '{ print "Name: " $0 } NR >= 1 { exit }' /p/raw.txt >> /p/001.txt 
awk '3 <= NR { print "Name: " $0 } NR >= 9 { exit }' /p/raw.txt >> /p/001.txt 

Это кажется, вы постоянно строит один файл от другого , Рассмотрим:

tail -Fn0 /p/raw.txt |sed 's/^/Name: /' >> /p/001.txt 

Это будет работать непрерывно, добавляя только новые записи (добавлены после выполнения команды) для /p/001.txt

Возможно, у вас есть много дублей, чтобы решить?

awk 'NR != FNR { $0 = "Name: " $0 } !s[$0]++' \ 
    /p/001.txt /p/raw.txt > /tmp/001.txt && mv /tmp/001.txt /p/001.txt 

Это складывает вместе ранее сохраненные имена с любыми новыми именами, названиями печати только один раз (!s[$0]++ верно, когда s[$0] равен нулю (его состояние по умолчанию), но после оценки, он увеличивает на один, что делает его ложным во втором вступлении. Когда у голого предложения нет действия, строка печатается.) Поскольку мы читаем выходной файл, нам нужен временный вывод. После его успешного завершения мы переместим его поверх целевого выходного файла.

+0

sed только решение выглядит блестящим – sjsam

+0

** Очень умный ! ** со всем уважением к первому решению sjsam - это гораздо более прямолинейно! Адам, может быть, вы могли бы расширить это, чтобы добавить не только ** Имя: ** ПЕРЕД, но и что-то ПОСЛЕ, например ** неизвестно **? Получить окончательный результат ** Название: John Doe неизвестен **? – Serge

+1

@Serge: вставьте вторую команду 's', которая заменяет дополнительный текст для' $ '(конец строки):' sed 's/^/Name: /; s/$/неизвестно /; q'' – mklement0

1
printf "Name : %s\n" "$(sed -n '1p;q' /p/raw.txt)" >/p/001.txt 

должен это сделать. Если sed не является обязательным требованием сделать

echo -e "Name : $(sed -n '1p;q' /p/raw.txt)" >/p/001.txt 

Note

  1. q вариант с sed завершает работу без обработки каких-либо дополнительных команд или ввода.
  2. Опция -e указывает эхо интерпретировать escape-последовательности. Это особенность оболочки bash.
+0

может быть опечаткой синтаксиса где-то? потому что cli говорит 'sed: -e выражение # 1, char 4: дополнительные символы после команды' – Serge

+0

@Serge: Исправлено, вы правы' \ n' ползутся в 'sed' – sjsam

+1

Этот вариант' echo -e 'Имя: $ (sed -n '1p; q' /p/raw.txt) ">/p/001.txt' лучше для меня, но интересно попробовать вариант от Адама – Serge