С GNU ed
и column
Учитывая файл global.bib
@article{Author1_2020,
year = 2020,
month = {feb},
publisher = {Wiley},
mama = {foo},
papa = {bar},
}
@article{Author2_2010,
year = 2010,
month = {jul},
publisher = {Journal},
mama = {foo},
papa = {bar},
}
@article{Author3_2010,
year = 2010,
month = {aug},
publisher = {Josh},
mama = {foo},
papa = {bar},
}
@article{Author4_2030,
year = 2030,
month = {dec},
publisher = {Jetchisel},
mama = {foo},
blah = {qux},
papa = {bar},
}
Скрипт ed
, назовем его script.ed
g/./s/^@.*//\
s/^}.*//
v/^.*publisher =.*$\|^.*year =.*$\|^.*month =.*$\|^$/d
,s/^.*publisher = \|^.*year = \|^.*month = //
g/./s/}//\
s/{//\
s/,//
g/./s/$/ /
g/./;/^$/j
,s/\([^ ]*\) \([^ ]*\) \([^ ]*\)/\3 \1 \2/
g/^$/d
,p
Q
Теперь запустите сценарий ed
для файла и направьте его в столбец с флагом -t
.
ed -s global.bib < script.ed | column -t
На выходе
Wiley 2020 feb
Journal 2010 jul
Josh 2010 aug
Jetchisel 2030 dec
Краткое объяснение.
строки 1 и 2, поиск по всему файлу g
означает глобальный, заменить все строки, начинающиеся с @
и }
на ничего, сделайте это пустой строкой.
\
- это продолжение строки. поэтому строки 1 и 2 - это всего лишь одна строка, разделенная новой строкой.
строка 3, v
означает противоположность тому, что совпадает внутри / /
, в этом случае publisher
, year
и month
плюс пустая / пустая строка, удалите ее, d
означает удаление.
строка 4, ,s
также является глобальным альтернатива для g
. удалите все, что находится внутри / /
, не удаляйте строки, которые его содержат, просто удалите это.
также подключены строки с 5 по 7, есть след \
, удалить все который соответствует внутри / /
, то есть {
, }
и ,
, строка 8 добавляет конечный пробел в файл.
строка 9, присоединение к непустой строке начинается с начала файла, g
для глобального, пока не достигнет пустой строки.
строка 10 , сделайте обратную ссылку на все поля и распечатайте их в нужном порядке.
строка 11 удалить все пустые / пустые строки.
строка 12 ,p
распечатать весь вывод в стандартный вывод.
строка 13, Q
выйти без ошибки, даже если буфер был изменен, измените его на w
, если он- необходимо редактировать файл.
Вы можете запускать скрипт ed построчно, просто включив все строки, разделенные \
и следующая строка после него, потому что это всего лишь один вызов ed.
С bash4+
grep
и column
#!/usr/bin/env bash
limit=3
while mapfile -n "$limit" -t array; (( ${#array[*]} )); do
array=("${array[@]//[\}\{,]}")
array=("${array[@]#*= }")
printf '%s %s %s\n' "${array[2]}" "${array[0]}" "${array[1]}"
done < <(
grep -E '^[[:space:]]*(publisher|year|month) = ' global.bib
) | column -t