Bash: перевернуть строки на другую сторону разделителя - PullRequest
1 голос
/ 26 марта 2020

По сути, у меня есть файл, отформатированный как

ABC:123

И я бы хотел перевернуть строки вокруг разделителя, чтобы он выглядел следующим образом

123:ABC

Я бы предпочел сделать это с помощью инструментов bash / linux.

Спасибо за любую помощь!

Ответы [ 3 ]

4 голосов
/ 26 марта 2020

Это довольно просто с внутренними командами bash, предполагающими два поля согласно следующей расшифровке:

pax:~$ x='abc:123'
pax:~$ echo "${x#*:}:${x%:*}"
123:abc

Первая подстановка ${x#*:} удаляет все от начала до двоеточия. Второй, ${x%:*}, удаляет все от двоеточия до конца.

Затем вы просто присоединяете их к двоеточию между ними.

Это не имеет значения для вашего конкретные данные, но % и # используют кратчайший возможный шаблон. Варианты %% и ## дадут вам максимально длинный шаблон (жадный).


В качестве отступления, это идеально, если вы делаете это для одной строки за раз, так как вы не Не нужно запускать внешний процесс, чтобы сделать работу за вас. Но если вы обрабатываете весь файл, есть лучшие способы сделать это, например, с помощью awk:

pax:~$ printf "abc:123\ndef:456\nghi:789\n" | awk -F: '{print $2 FS $1}'
123:abc
456:def
789:ghi
1 голос
/ 26 марта 2020
#!/bin/sh -x

var1=$(echo -e 'ABC:123' | cut -d':' -f1) 
var2=$(echo -e 'ABC:123' | cut -d':' -f2)
echo -e "${var2}":"${var1}"

Я использую cut, чтобы разбить строку на две части и сохранить обе эти части как переменные.

Оттуда можно использовать echo для перестановки переменных по своему усмотрению. .

0 голосов
/ 26 марта 2020

Использование sed.

sed -E 's/(.*):(.*)/\2:\1/' file.txt

Использование paste и cut с подстановкой процесса.

paste -d: <(cut -d : -f2 file.txt) <(cut -d : -f1 file.txt)

Медленное / медленное решение оболочки на большом наборе данных / файлы.

while IFS=: read -r left rigth; do printf '%s:%s\n' "$rigth" "$left"; done < file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...