Комплексный выход Sed с двойным интервалом - PullRequest
0 голосов
/ 05 декабря 2008

Позвольте мне начать с того, что я знаю, что, вероятно, есть гораздо более простой способ сделать это. Но это то, что у меня есть, и, надеюсь, в конце я смогу внести некоторые улучшения и / или упрощения.

Цель на данный момент

Для двойного пробела вывод, сохраненный в переменной $tmp ниже, и индивидуальное нумерация каждой строки. Это должно дать мне каждый набор исполняемых команд в отдельных строках.

Задача 1

Я перепробовал все, что мог придумать, чтобы удвоить пробел в переменной. Перемещение команды двойного пробела и изменение самой команды.

Для нумерации файлов, которые я пытался изменить этот код:

 sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /

И, конечно, экспериментировал с awk, но без прогресса ..

Не очень долгосрочные цели

  • Чтобы выполнить эти команды одну за другой и сравнить разницу в байтах. Или просто какая-то общая разница. На данный момент я знаю, что могу использовать команду diff с file1 file2, а затем сохранить вывод в некоторой переменной, такой как: "$diffA $diffB", и обновлять ее каждый раз, используя цикл, для вероятности передачи более 2 файлов в качестве аргументов.
  • Чтобы узнать разницу между каждой командной строкой. И эхо что-то вроде:

строка 1 в файле1 отличается от строки 1 в файле2, проверьте это: "$ diffA $ diffB"

Вот что у меня есть, начало положено:

#!/bin/bash

FILE="$1"

echo "You Entered $FILE"

if [ -f $FILE ]; then

tmp=$(cat $FILE | sed '/./!d' | sed -n '/regex/,/regex/{/regex/d;p}'| sed -n '/---/,+2!p' | sed -n '/#/!p' | sed 's/^[ ]*//' | sed -e\
s/[^:]*:// | sed -n '/regex /!p' | sed -n '/regex /!p' | sed -n '/"regex"/,+1!p' | sed -n '/======/!p' | sed -n '/regex/!p' | sed -n '/regex\
\r/!p' | sed -n '/regex /!p' )

fi

MyVar=$(echo $tmp)

echo "$MyVar | sed G"

FILE2="$2"
if [ -f $FILE2 ]; then
    if [ -f $FILE2 ]; then
         tmp2=$(cat $FILE2 | sed -n '/regex/,/regex/{/regex\ S/d;p}' |\ 
sed -n '/#/!p' | sed -e s/[^:]*:// | sed /--------/,+10d)
     fi


echo "$tmp2"

Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 05 декабря 2008

Следующий скрипт awk удвоит вывод и пронумерует строки:

awk ' { print NF " " $0; print ""; }'

Ваша проблема - присвоить это переменной:

( echo a; echo b) | awk ' { print NR " " $0; print ""; }'

дает:

1 a

2 b

но

tmp=$(( echo a; echo b) | awk ' { print NR " " $0; print ""; }')
echo "$tmp"

дает

1 a 2 b

потому что использование $ () заменит переводы строк пробелами. Вам нужно будет использовать временный файл:

tmp=$(mktemp)
awk ' { print NR " " $0; print ""; }' $FILE > $tmp
cat $tmp # Do something with the file
rm $tmp # Don't forget to clean up after yourself.
0 голосов
/ 25 декабря 2011

Это может работать для вас:

a=$(printf "aaa %d\n" {1..5} | sed = | sed 'N;s/\n//;G')
echo $a
1aaa 1 2aaa 2 3aaa 3 4aaa 4 5aaa 5
echo "$a"
1aaa 1

2aaa 2

3aaa 3

4aaa 4

5aaa 5

Пояснение:

  1. sed = вставляет номер строки, добавляет новую строку, а затем добавляет строку
  2. sed 'N's/\n//;G' Добавляет новую строку, читает другую строку и добавляет ее. s/\n// удаляет внедренный перевод строки. G добавляет символ новой строки в конец строки. В конце цикла новая строка присоединяется перед распечаткой.
0 голосов
/ 05 декабря 2009

Альтернативой использованию временного файла является использование кавычек для подавления замены новой строки / пробела:

tmp="$(echo a; echo b)"
echo "$tmp"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...