Shell один лайнер для предварительного ожидания в файл

Сделать копию существующего списка и перебрать новую копию.

for (String str : new ArrayList<String>(listOfStr))     
{
    listOfStr.remove(/* object reference or index */);
}
130
задан codeforester 27 November 2017 в 01:17
поделиться

12 ответов

Взлом ниже был быстрым неподготовленным ответом, который работал и получил много upvotes. Затем поскольку вопрос стал более популярным и больше переданного времени, оскорбленные люди начали сообщать, что он, вид обработанных но странных вещей мог произойти, или это просто, не работал вообще, таким образом, это было неистово downvoted какое-то время. Такая забава.

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

Теперь, со всем, чем из пути был ответ:


Создание другого дескриптора файла для файла (exec 3<> yourfile) отсюда при записи в это (>&3) кажется, преодолевает чтение-запись на той же дилемме файла. Работы для меня на 600K файлах с awk. Однако пробуя тот же прием с помощью сбоев 'кошки'.

Передача prependage как переменная к awk (-v TEXT="$text") преодолевает литеральную проблему кавычек, которая предотвращает выполнение этого приема с 'sed'.

#!/bin/bash
text="Hello world
What's up?"

exec 3<> yourfile && awk -v TEXT="$text" 'BEGIN {print TEXT}{print}' yourfile >&3
29
ответ дан 24 November 2019 в 00:22
поделиться

Если Вы пишете сценарий в Bash, на самом деле, можно просто выйти:

cat - yourfile  /tmp/out && mv /tmp/out yourfile

Это находится на самом деле в Сложном Примере, который Вы сами отправили в своем собственном вопросе.

0
ответ дан 24 November 2019 в 00:22
поделиться

Не возможный без временного файла, но здесь идет острота

{ echo foo; cat oldfile; } > newfile && mv newfile oldfile

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

18
ответ дан 24 November 2019 в 00:22
поделиться

Это все еще использует временный файл, но по крайней мере это находится на одной строке:

echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile

Кредит: Bash: предварительно ожидайте текст / Строки В Файл

99
ответ дан 24 November 2019 в 00:22
поделиться

Может стоить отметить, что это часто хорошая идея для безопасной генерации временного файла с помощью утилиты как mktemp, по крайней мере, если сценарий будет когда-либо выполняться с полномочиями пользователя root. Вы могли, например, сделать следующее (снова в ударе):

(tmpfile=`mktemp` && { echo "prepended text" | cat - yourfile > $tmpfile && mv $tmpfile yourfile; } )
16
ответ дан 24 November 2019 в 00:22
поделиться

Когда Вы начинаете пытаться сделать вещи, которые становятся трудными в сценарии оболочки, я настоятельно рекомендовал бы изучить перезапись сценария в "надлежащем" языке сценариев (Python/Perl/Ruby/и т.д.)

Что касается предварительного ожидания строки в файл, не возможно сделать это через передачу по каналу, как тогда, когда Вы делаете что-либо как cat blah.txt | grep something > blah.txt, это непреднамеренно очищает файл. Существует маленькая служебная команда, названная sponge, можно установить (Вы делаете cat blah.txt | grep something | sponge blah.txt, и она буферизует содержание файла, затем пишет это в файл). Это подобно временному файлу, но Вы не должны делать этого явно. но я сказал бы, что это - "худшее" требование, чем, скажем, Perl.

может быть способ сделать это через awk, или подобный, но если необходимо использовать сценарий оболочки, я думаю, что временный файл является безусловно самым легким (/только?) путь..

9
ответ дан 24 November 2019 в 00:22
поделиться

assuming that the file you want to edit is my.txt

$cat my.txt    
this is the regular file

And the file you want to prepend is header

$ cat header
this is the header

Be sure to have a final blank line in the header file.
Now you can prepend it with

$cat header <(cat my.txt) > my.txt

You end up with

$ cat my.txt
this is the header
this is the regular file

As far as I know this only works in 'bash'.

9
ответ дан 24 November 2019 в 00:22
поделиться

Вариант решения cb0 для "без временного файла" для добавления фиксированного текста:

echo "text to prepend" | cat - file_to_be_modified | ( cat > file_to_be_modified ) 

Опять же, это полагается на выполнение суб-оболочки - (..) - во избежание отказа кота иметь тот же файл для ввода и выход.

Примечание: понравилось это решение. Однако на моем Mac исходный файл потерян (думал, что этого не должно быть, но это так). Это можно исправить, написав свое решение как: echo "text to prepend" | кошка - file_to_be_modified | cat> tmp_file; mv tmp_file file_to_be_modified

2
ответ дан 24 November 2019 в 00:22
поделиться
current=`cat my_file` && echo 'my_string' > my_file && echo $current >> my_file

где "my_file" - файл, к которому нужно добавить "my_string".

0
ответ дан 24 November 2019 в 00:22
поделиться

John Mee: ваш метод не гарантированно работает, и, вероятно, потерпит неудачу, если вы добавите более 4096 байт (по крайней мере, так происходит в gnu awk, но я полагаю, что другие реализации будут иметь аналогичные ограничения). В этом случае он не только не выполнится, но и войдет в бесконечный цикл, в котором будет читать свой собственный вывод, тем самым заставляя файл расти, пока не заполнится все доступное пространство.

Попробуйте сами:

exec 3<>myfile && awk 'BEGIN{for(i=1;i<=1100;i++)print i}{print}' myfile >&3

(предупреждение: убейте его через некоторое время, иначе он заполнит файловую систему)

Более того, редактировать файлы таким образом очень опасно, и это очень плохой совет, поскольку если что-то случится во время редактирования файла (авария, переполнение диска), вы почти гарантированно останетесь с файлом в непоследовательном состоянии.

20
ответ дан 24 November 2019 в 00:22
поделиться
echo '0a
your text here
.
w' | ed some_file

ed - стандартный редактор! http://www.gnu.org/fun/jokes/ed.msg.html

31
ответ дан 24 November 2019 в 00:22
поделиться

Ба! О tac никто не упомянул.

endor@grid ~ $ tac --help
Usage: tac [OPTION]... [FILE]...
Write each FILE to standard output, last line first.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -b, --before             attach the separator before instead of after
  -r, --regex              interpret the separator as a regular expression
  -s, --separator=STRING   use STRING as the separator instead of newline
      --help     display this help and exit
      --version  output version information and exit

Report tac bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report tac translation bugs to <http://translationproject.org/team/>
-1
ответ дан 24 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

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