Не решение вашей проблемы, но работает, если использовать maim
вместо scrot
. Кроме того, я использую xclip
для автоматического копирования изображения в буфер обмена, что очень удобно.
awful.key({}, "#107",
function ()
awful.util.spawn_with_shell("FILE=".. os.getenv("HOME").. "/Media/Screenshots/snapshot-$(date +%Y-%m-%dT%H-%M-%S).png && maim -s --hidecursor $FILE && xclip -selection clipboard $FILE -t image/png")
end),
Использование любого awk в любой оболочке на каждом компьютере Unix:
awk '{
for ( fldNr=1; fldNr<=NF; fldNr++ ) {
numChars = length($fldNr)
numUnq = 0
split("",seen) # you could use delete(seen) here in most awks
for ( charNr=1; charNr<=numChars; charNr++ ) {
if ( !seen[substr($fldNr,charNr,1)]++ ) {
numUnq++
}
}
if ( numUnq == numChars ) {
next
}
}
print
}' file
LTCYMM SVNNDA DTVEV QLOPGO CUPUR
KKPQBP BKDKRU ZTPDPL ZRLUEL HRZZKO KXSKCU YZQTBT RISNKS
Используя perl
вместе с методом all
из модуля List::Util
мы можем обнаружить нужные строки (все слова, содержащие хотя бы один повторяющийся символ)
perl -MList::Util=all -lane '
print if all { /(.).*\1/ } @F;
' file
С помощью GnU sed
мы можем выбрать нужные строки, убедившись, что все нужные поля растягиваются от начала строки до конца.
$ sed -En '/^\s*(\S*(\S)\S*\2\S*(\s+|$))+$/p' file
Другой способ с sed
состоит в том, чтобы постепенно проверять наличие повторяющихся символов среди символов, отличных от пробелов. и не печатайте пространство шаблона, как только не будет найдено дубликатов в наборе символов без пробелов.
sed -Ee 'h
:loop
s/^\s+|\s+$//g
s/\S+/&\n/
/(\S).*\1.*\n/!d
s/^[^\n]*\n//
/./bloop
g
' file
Мы используем awk, а затем перебираем в цикле каждое слово и каждый символ в слове. Разделите слово на char и проверьте, не разбивается ли оно более чем на 2 части => в этом слове обнаружен дубликат. Аналогично в конце текущей строки, если количество обнаруженных дубликатов равно количеству полей => строка подходит для печати.
awk '
{
for (p=i=1+(w=0); i<=NF; i++) {
while (p <= length($i)) {
c = substr($i,p++,1)
if (split($i,a,c) > 2) {
w += p = 1
break
}
}
}
}
w==NF
' file
Вот еще одно решение на чистом Bash — нет perl
, нет grep
, нет awk
.
#!/bin/bash
set -euo pipefail
containssametwice() {
local -Ai chars=()
local -i i
for ((i = 0; i < ${#1}; ++i)); do
((++chars["${1:i:1}"] < 2)) || return 0
done
return 1
}
while IFS= read -r line; do
read -ra words <<< "$line"
for word in "${words[@]}"; do
containssametwice "$word" || continue 2
done
printf '%s\n' "$line"
done