Использование sed с параллельным доступом дает пустой вывод при перенаправлении в файл

1623
Simon O'Hanlon

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

setopt interactivecomments # In this trivial example it is obviously non-sensical # to use parallel, but in reality I have many files...  # Some very simple input data... paste <(printf "%s\n" `seq 1 4`) <(printf "%s\n" `seq 1 4`) > ./input.txt # This looks like: #1 1 #2 2 #3 3 #4 4   # Pass data file to parallel and use sed to substitute. # e.g. want to replace line '3 3' with '3 33' # Output goes to stdout & seems correct... z=`find ./input.txt` echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/"' #1 1 #2 2 #3 33 ===> correct replacement #4 4  # But redirecting to a file leads to empty file... echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" > {//}/result.txt'  # Empty file cat ./result.txt 

Что дает? Я указываю что-то неправильно?

Я использую:

  • Ubuntu 12.04.4 LTS
  • GNU parallel 20130522
  • GNU sed version 4.2.1
  • zsh 4.3.17
3

1 ответ на вопрос

3
Adaephon

When using redirection inside the command for parallel, you have to use {} to put the input at the right place, as parameter for sed:

echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" {} > {//}/result.txt' 

Additionally, if {//} (or any other replacement string) is used, parallel does not append the input at the end of the command automatically. (In this case that would be wrong anyways, as it would be after the redirection. )

Essentially, the code in the question runs

sed "s/(^3.*3\)/\13/" > ./result.txt 

but it needs to be

sed "s/(^3.*3\)/\13/" ./input.txt > ./result.txt 
Не совсем правильно: если используется какая-либо замещающая строка (например, {//}), то {} не будет добавлено. Таким образом, код запускается: sed "s / (^ 3. * 3 \) / \ 13 /"> ./result.txt (что также явно неверно. Используйте --dry-run для подтверждения). Так что ответ Адафона правильный, но по неправильной причине. Ole Tange 10 лет назад 1
@OleTange Спасибо за хедз-ап. Я отредактировал ответ соответственно. Adaephon 10 лет назад 0

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