$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
sed
удаляет все в строке до (, включая )последнее ]
, а tr
сжимает несколько последовательных пробелов в один пробел.
В качестве альтернативы, используя толькоsed
:
sed -e 's/.*]//' -e 's/ */ /g' file.txt
С заданными входными данными это дает тот же результат, что и первый конвейер.
Этот sed
сначала выполняет s/.*]//
, который удаляет все до]
(включительно ). Второе выражение соответствует ␣␣*
, то есть пробелу, за которым следует ноль или более пробелов, и заменяет их одним пробелом. Второе выражение применяется ко всей строке и имеет тот же эффект, что и tr -s ' '
, т. е. сжимает несколько последовательных пробелов в один пробел.
Использованиеawk
:
awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt
Здесь мы используем ]
или пробелы или табуляции в качестве разделителей полей (кратные из них могут разделять два столбца, поэтому мы используем *
после[...]
). С учетом этих разделителей нужные данные доступны в полях 3 и 4 каждой строки.
После того, как данные в вопросе были отредактированы, чтобы удалить некоторые пробелы между двумя последними столбцами, следующее также будет выполнять эту работу:
cut -d ']' -f 3 file.txt
или просто
sed 's/.*]//' file.txt
или
awk -F ']' '{ print $3 }' file.txt
Если вы просто хотите, чтобы строка «TLR» вашего ввода была той же длины после обработки, что и раньше, это будет:
awk '/H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1'
и окончательное решение, учитывая, что теперь мы знаем, что у вас есть окончания строк DOS и вы хотите их сохранить:
awk -v ORS='\r\n' '{sub(/\r$/,"")} /H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1' file
awk '/H ICOC/{cnt++} /^TLR/ {$0 = sprintf("TLR%-39d", cnt)} 1' file