Сед, чтобы соответствовать и заменить 2 последовательных линии? - PullRequest
0 голосов
/ 05 мая 2018

Я хочу сопоставить 2 строки подряд, а затем заменить его. Например, этот шаблон: [0-9]\(.*\)\n[0-9]\(.*\) поэтому в основном обе строки начинаются с числа. Затем замените его: \2\n\1 Означает поменять местами содержимое строки и отбросить ведущее число файл примера 1:

 adfa
adaf
dfd
1 1a
2 2b
3 3d
adfa
sdfa
4 4a
5 5b
6 6d
7 7k

файл примера 2:

 adfa
adaf
dfd
aaa
1 1a
2 2b
3 3d
sdfa
4 4a
5 5b
6 6d
7 7k

Многие ответы онлайн предлагают использовать N; или 1!N;, но это не сработает. Причина в том, что N; будет начинаться с 1-й строки, затем читать каждые 2 строки, 1!N; будет начинаться со 2-й строки, а затем читать каждые 2 строки. Но я хочу прочитать каждую строку и следующую строку, чтобы соответствовать. Если совпадают N и N + 1 строки, мы заменяем эти 2 строки, затем переходим к строке N + 3 и N + 4 для соответствия. Если совпадений нет, мы переходим к N + 4 и N + 5 ... Ожидаемый результат будет следующим для обоих файлов примера:

2b
1a
5b
4a
7k
6d

Неудачные команды:

sed 'N;s%[0-9]\(.*\)\n[0-9]\(.*\)%\2\n\1%;t;d' test0.txt
 3d
 2b
 5b
 4a
 7k
 6d

sed 'N;s%[0-9]\(.*\)\n[0-9]\(.*\)%\2\n\1%;t;d' test1.txt
 2b
 1a
 5b
 4a
 7k
 6d


sed '1!N;s%[0-9]\(.*\)\n[0-9]\(.*\)%\2\n\1%;t;d' test0.txt
 2b
 1a
 6d
 5b
7 7k
sed '1!N;s%[0-9]\(.*\)\n[0-9]\(.*\)%\2\n\1%;t;d' test.txt
 3d
 2b
 6d
 5b
7 7k

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Если вы используете D вместо d, т. Е. Удаляете первую строку шаблона-пробела и повторяете, если не пусто, тогда это работает, например ::

sed -nE 'N; s/^[0-9] (.*)\n[0-9] (.*)/\2\n\1/; ta; D; :a; p' infile

Или даже чище, как предложено @ potong :

sed 'N;/^[0-9] \(.*\)\n[0-9] \(.*\)/!D;s//\2\n\1/' infile

Выход:

2b
1a
5b
4a
7k
6d
0 голосов
/ 05 мая 2018

несовершенный способ достижения этого

sed -nr '/^[0-9]/{N;s/.*([0-9][[:alpha:]]).*([0-9][[:alpha:]])/\2\n\1/p}'
  1. Мы используем N только если строка начинается с цифры.
  2. Тогда мы могли бы использовать регулярное выражение, чтобы делать так, как нам нужно.

Это регулярное выражение разработано вашим файлом примера и должно быть изменено, если формат вашего файла изменился.

...