Я хочу сопоставить 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