Запись строки в файл без оболочки [closed]

Como ya señaló steeldriver, grepusa expresiones regulares básicas mientras que grep -Ey egrepusan expresiones regulares extendidas.

last | grep  '^161[0-9]\{3\}'
last | egrep '^161[0-9]{3}'
5
29.07.2018, 00:48
2 ответа

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

awk 'BEGIN {print "Hello" > "/tmp/file"}'

Когда программа awkсостоит только из оператора BEGIN, она просто интерпретирует этот оператор и не обрабатывает никаких входных данных.

Вы можете даже параметризовать это

awk -v text="World" -v file="/tmp/main" 'BEGIN {print text > file}'

Хотя с таким синтаксисом вам нужно экранировать символы обратной косой черты. Использование ARGVне имеет проблемы:

awk 'BEGIN {print ARGV[1] > ARGV[2]}' World /tmp/main
5
27.01.2020, 20:33

Если вам известен какой-либо другой не -пустой файл в системе, то с помощью POSIXsed:

sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile

С GNU sedи вашим собственным не -пустым файлом вы можете использовать:

sed -i.bak -e '$ihello world' -e 'd' foo

В BSD sedэто будет работать вместо этого:

sed -i.bak -e '$i\
hello world' -e d foo

Если вы не используете оболочку, вероятно, разрыв строки не является проблемой.


С ex, если целевой файл существует:

ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo

Это просто удаляет все в файле, заменяет первую строку на «hello world», затем записывает и завершает работу. Вы можете сделать то же самое с viвместо ex. Реализации не обязаны поддерживать несколько опций -c, но обычно поддерживают. Для многих exреализаций требование о том, что файл уже существует, не применяется.


Также сawk:

awk -v FN=foo -v STR="hello world" 'BEGIN{printf(STR) > FN }'

запишет "hello world" в файл "foo".


Если существуют файлы, содержащие нужные вам байты в известных местах,вы можете собрать файл байт за байтом с помощью нескольких команд с помощью dd(, в этом случае alphabetсодержит алфавит, но это может быть смесь входных файлов):

dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello

После этого будет работать обычный cp, или вы могли бы поместить его в место -для начала.


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

mispipe "echo 1" "tee wtarget"

эквивалентен echo 1 | tee wtarget, но возвращает код выхода echo. Это использует функцию system()внутри, которая не строго требует существования оболочки.


Наконец, perlявляется общей командой и позволяет вам писать произвольные программы, которые делают все, что вы хотите, в командной строке, как и pythonили любой другой распространенный язык сценариев. Точно так же, если оболочка просто не "запущена", но существует, sh -c 'echo 1 > target'будет работать нормально.

7
27.01.2020, 20:33

Теги

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