Новая строка так же допустима, как и любой другой символ в имени файла в Unix. Для оболочки этот символ имеет особое значение (, он разделяет команды ), поэтому его необходимо заключать в кавычки, как и любые другие специальные символы (, такие как пробел, ;
, |
... ).
В Bourne -, как и в оболочках, это можно сделать с помощью одинарных или двойных кавычек:
ls -d 'a
b'
Или:
ls -d "a
b"
Некоторые оболочки (ksh93
, zsh
, bash
, mksh
, FreeBSD sh
как минимум )также поддерживают:
ls -d $'a\nb'
Для scp
обратите внимание, что имя файла передается в оболочку входа удаленного пользователя. Когда вы делаете:
scp file user@host:something
это приводит к вызову оболочки входа пользователя в host
для интерпретации:
scp -t something
командная строка (по крайней мере с openssh ). Итак, если эта оболочка похожа на Борна -,это должно быть:
scp 'src/a
b' user@host:"dest/'a
b'"
Если да:
scp 'a
b' user@host:dest/
или
scp -r src user@host:dest/
sshd на сервере работает:
scp -t dest/
или
scp -r -t dest/
И имена файлов не передаются в командной строке удаленной оболочки, а встраиваются в поток данных между клиентом и сервером scp
. Однако я обнаружил (с openssh 7.2p2 по крайней мере ), что символ новой строки в конечном итоге преобразуется в\^J
(3 символа ).
Таким образом, вы можете использовать другой механизм вместо ssh
, который обеспечивает более надежную передачу файлов, например rsync
, sftp
, или tar
:
tar cf - src | gzip | ssh user@host 'cd dest && gunzip | tar xpf -'
Это также позволит лучше сохранять жесткие ссылки, программные ссылки и другие атрибуты файлов. Вам также может понадобиться рассмотреть преобразование кодировки, если имена файлов содержат символы, отличные от -ASCII.
Если вы можете вместо этого использовать sed
, вы можете напечатать строку 1 и любую строку, которая соответствует, например
sed -n -e '1p;/23154688789/p' file.txt
-n
скажет не печатать вывод, если не указано, 1p
говорит печатать строку 1 и /23154688789/p
печатает любую строку, которая соответствует этому шаблону
В коде замените '|' с участием ';' head дает вам первую строку, и передача ее в grep делает поиск grep только в первой строке. Вам нужно что-то вроде этого:
head -n 1 file.txt ; grep 23154688789 file.txt
Предполагая, что единственная строка , начинающаяся с «NTL», будет строкой заголовка, для достижения этого можно использовать один grep
.
$ grep -E '^NTL|23154688789' file.txt
NTL|OPC|RN1|CNL|NUE|NUF|TPB|EIP
23154688789 |4013|55115|11529|163624D585 |16D7620595 |1|...
$
Команда awk
позволяет это сделать. Здесь мы выводим строку, если номер записи(NR
)равен 1 или мы получаем совпадение в первом поле:
awk -v id=23154688789 'NR==1 || $1==id'
Результат
NTL|OPC|RN1|CNL|NUE|NUF|TPB|EIP
23154688789 |4013|55115|11529|163624D585 |16D7620595 |1|