Сделать копию существующего списка и перебрать новую копию.
for (String str : new ArrayList<String>(listOfStr))
{
listOfStr.remove(/* object reference or index */);
}
Взлом ниже был быстрым неподготовленным ответом, который работал и получил много 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
Если Вы пишете сценарий в Bash, на самом деле, можно просто выйти:
cat - yourfile /tmp/out && mv /tmp/out yourfile
Это находится на самом деле в Сложном Примере, который Вы сами отправили в своем собственном вопросе.
Не возможный без временного файла, но здесь идет острота
{ echo foo; cat oldfile; } > newfile && mv newfile oldfile
, можно использовать другие инструменты, такие как редактор или жемчуг, чтобы сделать это без временных файлов.
Это все еще использует временный файл, но по крайней мере это находится на одной строке:
echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile
Может стоить отметить, что это часто хорошая идея для безопасной генерации временного файла с помощью утилиты как mktemp, по крайней мере, если сценарий будет когда-либо выполняться с полномочиями пользователя root. Вы могли, например, сделать следующее (снова в ударе):
(tmpfile=`mktemp` && { echo "prepended text" | cat - yourfile > $tmpfile && mv $tmpfile yourfile; } )
Когда Вы начинаете пытаться сделать вещи, которые становятся трудными в сценарии оболочки, я настоятельно рекомендовал бы изучить перезапись сценария в "надлежащем" языке сценариев (Python/Perl/Ruby/и т.д.)
Что касается предварительного ожидания строки в файл, не возможно сделать это через передачу по каналу, как тогда, когда Вы делаете что-либо как cat blah.txt | grep something > blah.txt
, это непреднамеренно очищает файл. Существует маленькая служебная команда, названная sponge
, можно установить (Вы делаете cat blah.txt | grep something | sponge blah.txt
, и она буферизует содержание файла, затем пишет это в файл). Это подобно временному файлу, но Вы не должны делать этого явно. но я сказал бы, что это - "худшее" требование, чем, скажем, Perl.
может быть способ сделать это через awk, или подобный, но если необходимо использовать сценарий оболочки, я думаю, что временный файл является безусловно самым легким (/только?) путь..
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'.
Вариант решения 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
current=`cat my_file` && echo 'my_string' > my_file && echo $current >> my_file
где "my_file" - файл, к которому нужно добавить "my_string".
John Mee: ваш метод не гарантированно работает, и, вероятно, потерпит неудачу, если вы добавите более 4096 байт (по крайней мере, так происходит в gnu awk, но я полагаю, что другие реализации будут иметь аналогичные ограничения). В этом случае он не только не выполнится, но и войдет в бесконечный цикл, в котором будет читать свой собственный вывод, тем самым заставляя файл расти, пока не заполнится все доступное пространство.
Попробуйте сами:
exec 3<>myfile && awk 'BEGIN{for(i=1;i<=1100;i++)print i}{print}' myfile >&3
(предупреждение: убейте его через некоторое время, иначе он заполнит файловую систему)
Более того, редактировать файлы таким образом очень опасно, и это очень плохой совет, поскольку если что-то случится во время редактирования файла (авария, переполнение диска), вы почти гарантированно останетесь с файлом в непоследовательном состоянии.
echo '0a
your text here
.
w' | ed some_file
ed - стандартный редактор! http://www.gnu.org/fun/jokes/ed.msg.html
Ба! О 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/>