Как я могу инвертировать первый член предложения?

Я думаю, что все еще не понимаю полностью, что Вы спрашиваете здесь. Но free -o -m | awk '{print $4}' дает Вам вывод формы:

общий
123
456

Для проверки 123 и 456 против условия на ударе, Вы могли использовать для цикла вместо fiddeling с regexes:

for value in `free -o -m | awk '{print $4}'`; do 
    if [[ "$value" != "shared" && CONDITION ]]; then echo "$value matched my condition"; fi; 
done;
5
04.08.2014, 07:05
6 ответов

Один из способов - использовать read , чтобы разбить строку на первое слово и остальные, а затем вызвать rev только для первого слова

$ echo "a,b,c,d Access" | { read -r first rest; printf '%s %s\n' "$(rev <<< "$first")" "$rest"; }
d,c,b,a Access
8
27.01.2020, 20:31

A perl решение:

$ echo "a,b,c,d Access" | perl -anle 'print ~~reverse($F[0])," @F[1..$#F]"'
d,c,b,a Access
1
27.01.2020, 20:31

Справедливое предупреждение: это зависит от запятых.

echo "a,b,c,d Access" | tr ,\  '[\n*]' | 
sed '1!G;$s/\n/,/g;s/\([^,]*\),\(.*\)/\2 \1/p;h;d'

OUTPUT

d,c,b,a Access

Это длинновато - дольше, чем должно быть. Так проще:

set -f ; IFS=,\                                                                 
set -- ${0+a,b,c,d Access}
while [ -n "${2+?}" ]
do  r="$1,$r" 
shift ; done    
echo "${r%,} $1"

OUTPUT

d,c,b,a Access

OUTPUT

d,c,b,a Access

Still kinda long, but but least it makes sense. С функцией становится немного проще, потому что вы получаете массив оболочки. Например:

rev() ( i=
    set -f ; IFS=$1 ; shift ; set -- $*
    until [ "$((i=${i:=($#+1)}-1))" -eq 0 ]
    do  [ "$i" -gt 1 ] && s=$IFS || s=                                          
        eval printf '"%s$s"' \""\$$i"\"
    done
)
rev , a,b,c,d && echo \ Access

OUTPUT

d,c,b,a Access

Или, если он есть в переменной:

var="a,b,c,d Access"
rev , "${var% *}" && echo " ${var##* }"

OUTPUT

d,c,b,a Access
1
27.01.2020, 20:31

С sed:

sed 's/^/ /;:1
     s/^\([^ ]*\) \([^ ]\)/\2\1 /;t1
     s/ //'

С perl:

perl -pe 's/\S+/reverse $&/e'

С zsh:

string='a,b,c,d Access'
setopt extendedglob
result=${string/(#m)[^ ]#/${(j::)${(Oas::)MATCH}}}
4
27.01.2020, 20:31

используя pee (тройник) из moreutils (apt-get install moreutils):

echo -n "a,b,c,d Access" | pee "cut -d ' ' -f 1 | rev" "cut -d ' ' -f 2" | tr '\n' ' ''

Результат - d,c,b,a Access с трейлинговым пространством, которое поступает из переведенной новой строки.

3
27.01.2020, 20:31

В зависимости от Neven response:

Вы можете сделать это, используя этот скрипт оболочки:

#!/bin/bash
secondPart=`echo "a,b,c,d Access" | awk '{print $2} '`
firstPart=`echo "a,b,c,d Access" | awk '{print $1} '| awk -F , '{print $4","$3","$2","$1""}'`
echo "$firstPart $secondPart"

в командной строке просто напечатайте:

sh yourShellscript.sh

или используя одну командную строку как Jidder введенную:

awk '$1=gensub(/(.),(.),(.),(.)/,"\\4,\\3,\\2,\\1","g",$1)' <<< "a,b,c,d Access"
2
27.01.2020, 20:31

Теги

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