Как изменить \n на пробел и \n\n на \n с помощью sed?

Вместо использования отдельных переменных с именами, начинающимися с B2_, можно использовать ассоциативный массив(B2). например.

Обратите внимание, :следующее относится к zsh. kshи bashтакже имеют ассоциативные массивы, но синтаксис их инициализации и использования отличается (см. ниже ).

typeset -A B2
# initialise array
B2=(ACCOUNT_ID 12345 ACCOUNT_KEY 54321 REPOSITORY somewhere)

# two different ways of adding elements to the array
B2[FOO]=bar
B2+=(NAME fred)             

for key val in ${(kv)B2}; do 
  echo "$key: $val"
done

Вывод для этого примера будет:

ACCOUNT_KEY: 54321
FOO: bar
REPOSITORY: somewhere
ACCOUNT_ID: 12345
NAME: fred

Вы также можете распечатать весь массив (в форме, подходящей для повторного -использования в скрипте или в командной строке )с помощьюtypeset -p:

% typeset -p B2
typeset -A B2=( ACCOUNT_ID 12345 ACCOUNT_KEY 54321 FOO bar NAME fred REPOSITORY somewhere )

Те же операции в kshили Bash будут следующими:

# initialise it
typeset -A B2
B2=([ACCOUNT_ID]=12345 [ACCOUNT_KEY]=54321 [REPOSITORY]=somewhere)

# add elements
B2[FOO]=bar
B2+=([NAME]=fred) 

# get a list of the keys and use them as indexes to get the values
for key in "${!B2[@]}"; do 
  echo "$key: ${B2[$key]}"
done

# print the entire array
typeset -p B2
1
24.01.2020, 14:45
2 ответа

Вы можете сделать это, используя awk, работая в «режиме абзаца» (, см., например,. Решение @EdMorton здесь и решение проблемы «печатать все поля, кроме первых» из stackoverflow)

awk -v RS= -F'\n' '{$1=$2=""; print $0}' file.srt > file.txt

Это будет интерпретировать любые блоки «пустой строки» -разделенного текста как одну входную запись,чьи поля являются отдельными строками текстового блока. Приведенная выше команда затем заменит первые два поля (=lines )«пустой» строкой и напечатает всю строку.

Обратите внимание, что при этом остаются два пробела (в качестве разделителя полей вывода )перед «фактически выводом». Если это проблема, вы можете явно напечатать только оставшиеся поля с помощью внутреннего циклаawk-:

awk -v RS= -F'\n' '{for (i=3; i<NF; i++) printf("%s ",$i); printf("%s\n",$NF)}' file.srt > file.txt
2
27.01.2020, 23:17

используйте это, чтобы получить шаблон

sed ':begin;$!N;s/\n/ /;tbegin' file.txt | sed 's/  /\n/g'
3
27.01.2020, 23:17

Теги

Похожие вопросы