Чтобы уточнить вашу xargs
попытку
xargs -L1 sh -c 'f="${0##*/}"; printf "%s\n" "$0" > "${f%.*}.strm"' < file
Первая замена f="${0##*/}"
удаляет компоненты пути URL, а вторая "${f%.*}.strm"
удаляет и заменяет расширение.
Пр.
$ xargs -L1 sh -c 'f=${0##*/}; printf "%s\n" "$0" > "${f%.*}.strm"' < file
$ head *.strm
==> file_name1.strm <==
http://domain.com/file_name1.mkv
==> file_name2.strm <==
http://domain.com/file_name2.mkv
==> file_name3.strm <==
http://domain.com/file_name3.mkv
Действительно, комментарий @glenn -jackman является правильным ответом для вашего первого примера , но я был уверен, что это приведет к вопросу о том, почему это сработало, когда вы cat
это, и... получилось! Технически это отдельный вопрос, но это, честно говоря, логическая часть объяснения , почему ваша первоначальная попытка не сработала, ИМХО.
И, честно говоря, я написал большую часть этого ответа, прежде чем понял, что я, как и все остальные в комментариях, игнорирую cat dada1.json | jq | head
, et. др. недостатки.
Итак, начнем с ответа на первый пример:
Когда вы вызываете как jq dada1.json
, первый не -аргумент флага (, а не -, начинающийся с -
), анализируется как фильтр, как указал @glenn -jackman в комментарии.. jq
думает, что ваше имя файла является фильтром. Это должно быть очевидно из синопсиса справочной страницы, упомянутого в комментариях.
И да, как вы обнаружили, правильный вызов в этом случае jq '.' dada1.json
, чтобы он сначала анализировал фильтр, а затем необязательные имена файлов в конце строки команды -.
Так что же происходит, когда вы cat
это (т. е. передаете это )? Насколько я могу судить, это на самом деле не задокументировано в help/man, но этот фрагмент jq
кода вступает в игру:
if (!program && (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)))
program = ".";
Что, насколько я могу судить, назначает по умолчанию «программу» (, то есть «фильтр» ), если:
Таким образом, это в основном делает «интеллектуальный запасной вариант», чтобы разрешить вызов только с помощью | jq
.
Что касается остальных примеров, где вы перенаправляете вывод и это не удается, это работает для меня (и других в комментариях )в jq
версии 1.6 (. и позднее ).В более ранних версиях была проблема с перенаправлением (благодаря @fra -san в комментариях напрасно это ). Мы предполагаем, что вы используете более старую версию.
. на 1,6:
> cat dada1.json | jq | head
{
"output": "somethingsomething"
}
> cat dada1.json |jq > dada2.txt
> cat dada2.txt
{
"output": "somethingsomething"
}
> rm dada2.txt
> cat dada1.json |jq |tee -a dada2.txt
{
"output": "somethingsomething"
}
> cat dada2.txt
{
"output": "somethingsomething"
}