команда оболочки ' var = «[ap]»; echo $ var 'выводит «h», какое объяснение? [дубликат]

Вы также можете сделать это с помощью одного вызова GNU awk:

reshape.awk

# Set awk to split input at whitespace characters and
# use tab as the output field separator 
BEGIN {
  RS="[ \t\n]+"
  OFS="\t"
}

# Print using OFS or ORS based on the element index
{
  printf "%s", $1 (NR%n == 0 ? ORS : OFS)
}

# Append a missing new-line when last row is not full
END { 
  if( NR%n != 0) 
    printf "\n"
}

Запустите его так:

awk -f reshape.awk n=2 infile

Или как однострочник:

awk -v n=2 'BEGIN { RS="[ \t\n]+"; OFS="\t" } { printf "%s", $1 (NR%n == 0 ? ORS : OFS) } END { if( NR%n != 0) printf "\n" }' infile

Вывод:

a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

Или с n = 3 :

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj
2
20.03.2017, 00:25
2 ответа

У вас есть имя файла h в каталоге, где вы запустили

echo $var

Оболочка пытается использовать [ap] как глобус, и если что-то совпадает, он заменяет глобус совпадением. Для файла с именем h он становится

echo h

. Вы можете предотвратить это, заключив расширение в кавычки, что приведет к тому, что оно не будет рассматриваться как glob.

echo "$var"
6
27.01.2020, 21:50

Не используя кавычки в echo $ var , вы подвергаете расширение как «разбиению», так и «расширению имени пути» (также известному как «подстановка» или « генерация имени файла ").

Это означает, что строка, содержащая [ (также * и ? ), будет расширена по правилам «раскрытия имени пути». В вашем случае это означает, что существует файл с именем, состоящим только из одного символа, с именем h .

Если вы процитируете расширение, «Расширение имени пути» не будет выполнено:

$ echo "$var"
[a-p]
3
27.01.2020, 21:50

Теги

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