Как пропустить все линии вместе в файле / для всех файлов в каталоге

попробуйте это

DRI_PRIME=1 glxgears -info
0
02.03.2017, 17:13
8 ответов

Использование Vim:

vim -Nesc 'bufdo! %j! | w %_cat' -c 'qa!' *
  • -Nesc используется для запуска в несовместимом, тихом ex-режиме, который полезен для написания сценариев Vim.
  • буфдо! <команда> запускает команду для каждого буфера, не останавливаясь для измененных файлов
  • % j! объединяет все строки без вставки пробелов (просто j добавляет пробелы), % - все строки в контексте диапазона
  • w% _cat сохраняет текущий файл в <имя файла> _cat , % - текущее имя файла в контексте имени файла
  • -c 'qa!' затем, наконец, закрыть без сохранения всех файлов.
0
28.01.2020, 02:14

Simple cat + tr должно быть достаточно. Если нет, возможно, что-то не так с вашей системой:

sh-4.2$ cat file1 file2 
atagacat 
agataga 
ctcatctat 
tagcatag 
atagacat 
agataga 
ctcatctat 
tagcatag
sh-4.2$ cat file1 file2 |tr -d '\n'
atagacatagatagactcatctattagcatagatagacatagatagactcatctattagcatag

Протестируйте онлайн здесь: http://www.tutorialspoint.com/execute_bash_online.php?PID=0Bw_CjBb95KQMdUM4UER3SzE5Sk0

Обновление

После вашего пояснения в комментариях, что вам необходимо удалить новые строки из каждого файла отдельно и не объединять все файлы вместе (ps: не помещайте полезные пояснения в комментарии - вместо этого отредактируйте свой главный вопрос), вы можете использовать что-то вроде:

perl -pe 's/\n//g' file >file_cat #perl -pe is directly equivalent to `sed`.  

Вы также можете использовать perl -pe для одновременной замены нескольких файлов в нескольких файлах:

perl -pe 's/\n//g' -i file{1..100) #-i : in-place replacements in each file
OR
perl -pe 's/\n//g' -i.bak file{1..100) #in-place replacement keeping also a backup of original file

ALSO this works for all txt files in a directory
perl -pe 's/\n//g' -i.bak *.txt #in line replacement of all txt files in current directory keeping also a back up file

Вы можете использовать какой-то цикл, подобный упомянутому в других ответах, или подобный этому:

while IFS= -r -d '' fname;do 
  perl -pe 's/\n//g' "$fname" >"${fname}_cat"
  #any other command you might need like echo,cat,whatever
done < <(find . -maxdepth 1 -type f -name 'file*' -print0)
4
28.01.2020, 02:14

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

for i in file*; do
    awk '{gsub(/[[:space:]]*/, "");printf $0}' $i > ${i}_cat
done

, где gsub делает следующее (цитируется из manual):

gsub(regexp, замена [, target])

Поиск цели для всех самых длинных, левых, неперекрывающихся совпадающих подстроек, он может найти и заменить их заменой. «g» в gsub() означает «глобальный», что означает «заменять везде». Например:

{ gsub(/Britain/, "United Kingdom"); print }

заменяет все вхождения строки 'Britain' на 'United Kingdom' для всех входных записей.

Функция gsub() возвращает количество сделанных подстановок. Если переменная для поиска и изменения (target) опущена, то используется вся входная запись ($0). Как и в sub(), символы '&' и '' являются специальными, и третий аргумент должен быть назначен.

0
28.01.2020, 02:14
find . -maxdepth 1 -type f -exec perl -i -l -0777pe 'y/\n//d' {} +

. find забирает файлы из текущего каталога без рекурсинга и передает их Perl в связке, которая затем удаляет их из новых строк и сохраняет изменения в каждом файле.

find . -maxdepth 1 -type f -exec sed -i -e '$!{N;s/^/\n/;D;};s/\n//g' {} +

Другие методы для однострочка файла:

perl -i -lpe '$\ = eof ? "\n" : ""' yourfile
sed  -i -e   'H;$!d;g;s/\n//g'      yourfile

< yourfile sed 's/.*/[&]/' | dc -e '[[]pq]sq [?z0=q n z0=?]s? l?x'
0
28.01.2020, 02:14

С помощью awk:

awk '{printf $0> (FILENAME"_cat")}' *

Если вам нужна новая строка в конце нового файла:

awk '{printf $0> (FILENAME"_cat")}' *; sed -i -e '$a\' *_cat
0
28.01.2020, 02:14
for name in ./*; do
  test -f "$name" && (tr -d '\n'; echo) <"$name" >"${name}_cat"
done

Это удалит все символы новой строки во всех обычных файлах (отдельно) в текущем каталоге (это то, что делает tr -d '\ n' ). echo обеспечит наличие новой строки в конце строки в каждом сгенерированном файле.

2
28.01.2020, 02:14

Не используйте для этого tr . tr -d '\ n' удаляет все символы новой строки. Непустой файл без символа новой строки не является текстовым файлом. Вам нужен один символ новой строки в конце, чтобы последовательность символов считалась правильной строкой текста.

Каноническая команда для объединения всех строк в одну - это команда paste:

 for file in ./*; do paste -sd '\0' "$file" > "${file}_cat"; done

Это сделает это для всех не скрытых файлов (независимо от их типа - обычные, символические ссылки, каталоги ...) в текущий каталог. Если нет скрытого файла в оболочках, отличных от zsh , это приведет к тому, что paste выдаст ошибку и создаст пустой файл * _ cat .

Это также создаст пустые файлы file_cat для файлов, которые нельзя открыть. Чтобы избежать некоторых из этих проблем, вы можете предпочесть:

for file in ./*; do
  [ ! -f "$file" ] || paste -sd '\0' - < "$file" > "${file}_cat"
done

вместо этого ( -f - рассматривать только обычные файлы или символические ссылки на обычные файлы) или лучше и короче с zsh :

file (./*(N-.)) do paste -sd '\0' - < $file > ${file}_cat

(добавьте квалификатор glob D , чтобы включить скрытые файлы).

-d '\ 0' - стандартный способ указать пустой разделитель (он не означает разделитель символов NUL). Некоторые реализации paste поддерживают -d '' для этого также, хотя это не переносимо (другие реализации paste будут жаловаться на отсутствующий разделитель).

1
28.01.2020, 02:14

Вы можете использовать tr в цикле следующим образом:

for file in *; do
  [[ -f "$file" ]] || continue  # skip if not a regular file
  printf "%s\n" $(tr -d '\n' < "$file") > "$file"_cat
done

\ n в printf гарантирует, что мы действительно добавляем одну новую строку в конец объединенной строки.

0
28.01.2020, 02:14

Теги

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