Пузырьки a перед b с помощью sed

, если это LTO или другая лента со вспомогательной памятью:

sg_logs -a /dev/sgX

где sgX - это универсальное устройство SCSI, соответствующее вашему ленточному накопителю ( sg_map или sg_scan могут помочь вам найти его, если вы еще не знаете его, например, из проверки предупреждений на магнитной ленте)

1
11.05.2017, 21:49
4 ответа

Чуть более эффективный способ с sed:

sed 'h; s/b//g; x; s/a//g; H; x; s/\n//' file.txt

С perl:

perl -lpe '$_ = y/b//dr . y/a//dr' file.txt

Другой способ с perl:

perl -lpe '$_ = join "", sort split //' file.txt

(это работает, потому что "a" lt "b").

С GNU awk:

awk '{ print gensub(/b/, "", "g") gensub(/a/, "", "g") }' file.txt

С bash:

while read -r line; do
    printf '%s%s\n' "$( tr -d b <<<"$line" )"  "$( tr -d a <<<"$line" )"
done <file.txt
4
27.01.2020, 23:12

Я создал файл с именем test.txt и выполнил следующую команду:

sed -e ':loop' -e 's/ba/ab/' -e 't loop' test.txt
4
27.01.2020, 23:12
if [[  "${row:$j:1}" == a ...

Если вы идете этим путем, я думаю, вы могли бы просто сделать все это в оболочке:

while read -r s ; do
    for (( i = 0 ; i < ${#s} ; i++ )) ; do 
        [ "${s:i:1}" = "a" ] && astr+=a || bstr+=b
    done
    echo "$astr$bstr"
done
1
27.01.2020, 23:12
perl -pe 's/(b+)(a+)/$2$1/ while /ba/'  data.file

до тех пор, пока запись содержит «b», за которой следует «a», мы продолжаем переворачивать «острова» пчел и да в текущей записи.

perl -F\(b+\) -lne '
   my @A;
   splice @A, (/b/ ? @A : 0), 0, $_  for @F;
   print @A;
' data.file

Мы инициализируем массив @A для каждой прочитанной записи/строки. Поля, вырезанные из записи (хранящиеся в @F), проверяются, и когда они содержат «b», помещаются в конец массива, в противном случае размещенного с начала. Наконец, мы печатаем массив.

0
27.01.2020, 23:12

Теги

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