awk '{печатают 9$}' последний ls-l столбец включая любые пробелы в имени файла

X ++ увеличит значение, но тогда возвратит его старое значение.

Так в этом случае:

static void Main(string[] args)
{
    int x = 10;
    x = x++;
    Console.WriteLine(x);
}

Вы имеете X в 11 просто на мгновение, тогда это возвращается к 10, потому что 10 возвращаемое значение (x ++).

Вы могли вместо этого сделать это для того же результата:

static int plusplus(ref int x)
{
  int xOld = x;
  x++;
  return xOld;
}

static void Main(string[] args)
{
    int x = 10;
    x = plusplus(x);
    Console.WriteLine(x);
}

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

static void Main(string[] args)
{
    int x = 10;
    x = ++x;
    Console.WriteLine(x);
}
16
задан Alex Harvey 12 April 2019 в 11:23
поделиться

5 ответов

Лучшее решение: не пытайтесь анализировать вывод ls в первую очередь.

Официальная вики-страница irc.freenode.org канала #bash дает объяснение, почему это Плохая идея, и какие альтернативные подходы вы можете использовать вместо этого: http://mywiki.wooledge.org/ParsingLs

Использование find, stat и подобных инструментов предоставит вам функциональность » мы ищем без подводных камней (не все из которых очевидны - некоторые возникают только при переходе на платформы с другими реализациями ls).

Для вашего конкретного примера, я предполагаю, что вы пытаетесь найти только файлы ( а не каталоги) в вашем текущем каталоге; Ваша текущая реализация с использованием ls -l содержит ошибки, поскольку исключает файлы с разрешениями + t или setuid. Правильный способ реализации этого был бы следующим:

find . -maxdepth 1 -type f -printf '%f\n'
33
ответ дан 30 November 2019 в 16:09
поделиться

Просто для завершение. Это также можно сделать с помощью sed:

# just an exercise in regex matching ...
ls -l | sed -E  -e '1d; s/^([^ ]+ +){8}//' 
3
ответ дан 30 November 2019 в 16:09
поделиться
echo 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 
  awk 'BEGIN {OFS=ORS=""} ; {for (i=9;i<NF;i++) print $i " "; print $NF "\n"}'
1
ответ дан 30 November 2019 в 16:09
поделиться

Если вы по-прежнему настаиваете на ls -l вместо find или других инструментов, вот мое решение. Это некрасиво и деструктивно:

  1. Уничтожьте $ 1 ... $ 8, установив для них значение "" с помощью цикла for
  2. Это оставит кучу пробелов перед $ 9, удалите их с помощью команды sub ()
  3. Распечатать оставшиеся
ls -l | awk '{for (i = 1; i < 9; i++) $i = ""; sub(/^ */, ""); print}'
2
ответ дан 30 November 2019 в 16:09
поделиться

Возможно, есть лучший подход, который включает в себя как-то объединение полей, но:

$ echo 1 2 3 4 5 6 7 8 9 10 11 12 13 14... | 
  awk '{for (i = 9 ; i <= NF ; i++) printf "%s ", $i}'
9 10 11 12 13 14... 

Использование printf "% s" $ i напечатает i-е поле с пробелом после него вместо новой строки. Цикл for просто говорит перейти от поля 9 к последнему полю.

2
ответ дан 30 November 2019 в 16:09
поделиться
Другие вопросы по тегам:

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