Не надо.
python -c 'import sys; import crypt; print(crypt.crypt(sys.argv[1], crypt.mksalt(crypt.METHOD_SHA512)))' "$Password"
С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
Сzsh
:
input=linux-unix-linux-unix-manjaro
output=${(j[-])${(us[-])input}}
Если это нужно делать в каждой строке текстового файла:
perl -MList::Util=uniq -F- -lape '$_ = join "-", uniq @F' < input.txt > output.txt
Если вы хотите использовать 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
инициализировать переменную
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-