Разделить одну строку на несколько строк, пока они не совпадут с определенным шаблоном

Да, файл будет автоматически закрыт при завершении процесса, независимо от причины завершения процесса.

Это задокументировано в POSIX . В «Последствия завершения процесса », среди прочих последствий:

  • All of the file descriptors, directory streams, conversion descriptors, and message catalog descriptors open in the calling process shall be closed.

И в «Завершение процесса »:

It is important that the consequences of process termination as described occur regardless of whether the process called _exit() (perhaps indirectly through exit()) or instead was terminated due to a signal or for some other reason.

0
01.02.2020, 08:59
4 ответа

Используя sed, мы можем сделать:

sed -E ':j s/ ([^ ]*)$/\n\1/; t j;' infile \
| sed -E ':j /(:|#)$/ { N; s/\n/ /;t j; }'

первая команда sedразбивает строку на каждый видимый пробел, начиная с конца строки;

вторая команда sed, соединяющая те строки, которые заканчиваются на #или :.

1
28.04.2021, 23:24

С GNU awk для FPAT и при условии, что, как и в вашем опубликованном образце ввода, ваш реальный ввод не содержит пробелов и т. д. в именах ваших файлов:

$ awk -v FPAT='(#\\s+\\S+:\\s+)?\\S+' '{for (i=1; i<=NF; i++) print $i; print ""}' file
# file: /home/mytest/data
# owner: own
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:smr:rwx
default:group:agm:r-x
default:mask::rwx
default:other::---

# file: /home/mytest/datasr123
# owner: own
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---
0
28.04.2021, 23:24

у меня работало нормально

for ((i=1;i<=2;i++)); do sed -n ''$i'p' filename |sed "s/#/\n#/g" |sed '/^$/d'| sed "3s/ /\n/3g";echo " "| sed "s/.*/&\n/g"; done

выход

# file: /home/mytest/data 
# owner: own 
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:smr:rwx
default:group:agm:r-x
default:mask::rwx
default:other::---


# file: /home/mytest/datasr123 
# owner: own 
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---
0
28.04.2021, 23:24

Альтернатива awk

awk '{ for (i=1; i<=NF; i++) if ($i ~ "[#:]$" ) printf $i" "; else  print $i; }' c1.txt

И sedвариант, правда более хрупкий

sed -E "s/([^:#]) ([#a-z])/\1\n\2/g" c1.txt
0
28.04.2021, 23:24

Теги

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