Требуется какой-нибудь sed или awk для удаления последовательных или дубликатов из строк

Не надо.

python -c 'import sys; import crypt; print(crypt.crypt(sys.argv[1], crypt.mksalt(crypt.METHOD_SHA512)))' "$Password"
-1
26.05.2020, 10:14
4 ответа

СGNU sed(синтаксис будет отличаться для других реализаций)

$ s='linux-unix-linux-unix-manjaro-jaro-linuxy-jar'

$ echo "$s" | sed -E ':a s/(^|-)([^-]+)(-.*)?-\2(-|$)/\1\2\3\4/; ta'
linux-unix-manjaro-jaro-linuxy-jar


Сperl

$ echo "$s" | perl -lpe 'while( s/(?:^|-)([^-]++).*\K-\1(?=-|$)// ){}'
linux-unix-manjaro-jaro-linuxy-jar


Сruby

$ echo "$s" | ruby -F'-' -lane 'puts $F.uniq * "-"'
linux-unix-manjaro-jaro-linuxy-jar
1
18.03.2021, 23:32

Сzsh:

input=linux-unix-linux-unix-manjaro
output=${(j[-])${(us[-])input}}

Если это нужно делать в каждой строке текстового файла:

perl -MList::Util=uniq -F- -lape '$_ = join "-", uniq @F' < input.txt > output.txt
1
18.03.2021, 23:32

Если вы хотите использовать awk, должно работать следующее:

awk -F'-' -v OFS='-' '{delete a; for (i=1;i<=NF;i++) {if (!a[$i]++) printf("%s%s",(i==1) ? "" : OFS, $i)}}'

Это приведет к разделению входной строки на каждом -и перебору всех полей. Для каждого значения поля увеличивается запись в «массиве счетчиков событий» a. Только если этот счетчик вхождений равен 0, поле будет напечатано.

Чтобы применить это к каждой строке входного файла:

awk -F'-' -v OFS='-' '{delete a; for (i=1;i<=NF;i++) {if (!a[$i]++) printf("%s%s",(i==1) ? "" : OFS, $i)}; printf("%s",ORS)}' input.txt

Если ваш awkне поддерживает команду deleteдля всего массива, измените ее как

awk -F'-' -v OFS='-' '{split("",a); for (i=1;i<=NF;i++) {if (!a[$i]++) printf("%s%s",(i==1) ? "" : OFS, $i)}; printf("%s",ORS)}' input.txt
1
18.03.2021, 23:32

инициализировать переменную

str="linux-unix-...." 

GNU sed в расширенном режиме регулярных выражений:(исправлено на основе входных данных Sundeep)

echo "$str" |
sed -re '
  :a;s/(^|-)([^-]+)(.*)-\2(-|$)/\1\2\3\4/;ta
' 

echo "$str" |
awk -F- -vOFS=- '{
   N = split($0, a); $0 = "";
   for ( i=j=1; i<=N; i++ )
     if ( ! seen[a[i]]++ )
       $(j++) = a[i]
}1'

perl -lse '
  $h{$_}++ or $A[@A]=$_ for /[^-]+/g;
  print join "-", @A;
' -- -_="$str"

python3 -c 'import sys
 L, S = sys.argv[1].split("-"), set()
 print("-".join([e for e in L if not (e in S or S.add(e))]))
' "$str" 

Стандарт POSIX:

echo "$str" |
sed  -e '
    s/-/--/g;s/.*/-&-/
    :a
      s/\(\(-[^-][^-]*-\).*\)\2/\1/
    t a
    s/--/-/g;s/^-//;s/-$//
'

Утилиты Linux:

echo "$str" | tr  \- \\n | 
awk '!a[$0]++' | paste -sd-
0
18.03.2021, 23:32

Теги

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