printf %s\\n 'A B C' '1 2 3 4'|
sed -e's/\([^ ]*\) *[^ ]*/&\n\1/;//P;D'
A B
A C
1 2
1 3
1 4
Это работает. Он выбирает первые две последовательности из нуля или нескольких непробельных символов, разделенных одним или несколькими пробелами. Первая такая последовательность указана в \ 1
, а весь выбор - в и
. Выделение заменяется на себя, за которым следует \ n
ewline, затем \ 1
. Затем пространство шаблонов печатается до первой встречающейся новой строки, а затем эта же часть D
удаляется перед тем, как пространство шаблонов повторно используется в верхней части скрипта с тем, что остается.
Вы можете увидеть, что он делает, с помощью команды l
ook. Замените P
w / l
и поместите другой l
перед s ///
ubstitution ...
A B C$
A B\nA C$
A C$
A C\nA$
A$
1 2 3 4$
1 2\n1 3 4$
1 3 4$
1 3\n1 4$
1 4$
1 4\n1$
1$
printf %s\\n 'A B C' '1 2 3 4'|
sed -ne:t -e'/ *[^ ]*/{s//\n&/2;P;s///;} -ett
A B
A C
1 2
1 3
1 4
Он соответствует пробел с хотя бы одной последовательностью пробелов и любыми конечными непробелями. Первая подстановка вставляет новую строку перед вторым появлением такой последовательности, затем P
ринт до новой строки, а вторая подстановка удаляет первое вхождение этого шаблона - который также теперь будет включать новую строку в первую один добавляется к концу этой последовательности при работе со вторым. t
est разветвляется обратно на метку : t
каждый раз, когда происходит подстановка, и поэтому sed
съедает пространство шаблонов разделенное пробелом поле за раз.
С l
ОК снова:
A B C$
A B\n C$
A C$
A C$
1 2 3 4$
1 2\n 3 4$
1 3 4$
1 3\n 4$
1 4$
1 4$
От мужчина:
-c, --count
Подавление нормального вывода; вместо этого выведите количество совпадающих строк для каждого входного файла.