Принудительно вводить символы новой строки с подстановочными знаками cat

На мою страницу справочника Ubuntu 12.04.2 для, 'кто' управляет, 'кто я' (или кто с любыми двумя аргументами) совпадает с, 'кто-m' и должен дать Вам имя хоста и пользователя, связанного с STDIN. Однако я не получаю вывода с, 'кто я'. Или страница справочника является неправильной или команда, имеет ошибку. Независимо, как ранее отвечено ckhan, команда 'whoami' даст Вам имя пользователя для Вашего эффективного идентификатора пользователя. По крайней мере, в Ubuntu 12.04.2, ни один из идентификатора, 'то, кто я' или 'whoami', даст Вам просто имя пользователя человека, не вошел в систему на текущем терминале. Как обходное решение Вы могли получить это с:

who | sed 's/ .*//'
9
14.10.2015, 17:24
6 ответов

Определите функцию оболочки, которая выводит конец строки после каждого файла и использует его вместо cat :

endlcat() {
  for file in "$@"; do
    cat -- "$file"
    echo
  done
}

тогда вы можете использовать endlcat * .

Цикл for перебирает все предоставленные аргументы ( $ @ ), которые уже экранированы оболочкой при использовании подстановочных знаков типа * . - требуется, чтобы не подавлять имена файлов, начинающиеся с тире. Наконец, echo выводит новую строку.

12
27.01.2020, 20:04

Если вы хотите, чтобы имя файла было между файлами, используйте tail :

tail -n +1 ./*

(Если вы хотите tac вместо cat ], некоторые реализации хвоста имеют параметр -r для эквивалентного tac функционала)

3
27.01.2020, 20:04

Просто используйте цикл вместо простого cat :

for file in /path/to/targetdir/*; do
    echo "-------- $file -------"
    cat "$file" 
done
5
27.01.2020, 20:04

Подобно ответу @terdon , если вы предпочитаете видеть имя файла и в будущем, вы можете использовать head команда:

$ head *file*
==> file_1 <==
file 1 content

==> file_2 <==
file 2 content

==> file_3 <==
file 3 content

head по умолчанию использует первые 10 строк, поэтому использование ее без параметров команды для вашего случая (одно предложение на файл) вполне нормально. В противном случае вам понадобится опция -n X .

2
27.01.2020, 20:04

Это будет работать:

sed '' -- *

Вам не нужны никакие циклы оболочки или что-то еще, и это всегда будет следовать за выводом файла с \newline - за исключением, возможно, самого последнего.

Иначе, если вы хотите, чтобы между выводами каждого файла выводилась пустая строка, это может сработать:

bpaste(){
    eval "paste -'sd\n' -- $(x=0;for f do printf "\"\${$((x+=1))}\" - ";done)"
}   </dev/null

Это всегда будет следовать за выводом файла с \newline и дополнительной пустой строкой.

Вы можете назвать это так:

bpaste *
3
27.01.2020, 20:04

Другой способ - использовать grep -h для простого поиска пустой строки в каждом файле. Это будет соответствовать всем строкам, независимо от того, сколько строк завершается символом новой строки или нет. Результаты grep всегда заканчиваются новой строкой. Параметр -h подавляет префикс каждой строки вывода с именем файла, из которого оно было получено:

$ printf 'a' > a
$ printf 'b\nB' > b
$ printf 'c\n' > c
$ ls
a  b  c
$ cat -- *
ab
Bc
$ grep -h '' *
a
b
B
c
$ 

Или вы можете использовать GNU paste в -s erial mode с новая строка в качестве разделителя:

$ paste -s -d '\n' -- *
a
b
B
c
$ 
2
27.01.2020, 20:04

Теги

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