В
var="foo\
bar"
Последовательность \
является специальной внутри двойных кавычек, но не внутри одинарных кавычек и является удалено , поэтому $ var
содержит foobar
.
Когда вы делаете:
echo $json
Вы используете оператор split + glob (неявный оператор вызывается, когда вы забываете процитировать расширение), то есть содержимое $ json
разделяется для символов в $ IFS
, и каждое слово подлежит генерации имени файла (также называемой подстановкой).
Значение по умолчанию $ IFS
содержит пробел табуляции и новой строки (а пробел, табуляция и новая строка также подвергаются особой обработке в отношении разделения, поскольку любая их последовательность считается как единица и ведущая и завершающие игнорируются). Так, например, в:
var=' foo *
bar'
echo $var
$ var
сначала разбивается на foo
, *
и bar
( разделенная часть ) и *
расширяется до списка нескрытых файлов в текущем каталоге (часть glob ).
Если вы хотите отображать контент как есть (но обратите внимание, что многие реализации echo
могут искажать контент), вы должны написать:
$ echo "$json"
[ { "count": 3 } ]
Теперь, если вы намерены сжать интервалы , возможно, вы можете использовать оператор split + glob в своих интересах.
json='
[
{
"count": 3
}
]'
unset -v IFS # make sure we get a default splitting behaviour.
# an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part
echo $json # use the split+glob operator
echo
выводит свои аргументы, разделенные пробелами, поэтому каждая последовательность символа пробела, табуляции или новой строки будет фактически заменена одним символом пробела (кроме начального и конечного, которые будут удалены, и echo
добавляет в конец один символ новой строки). Таким образом, вы получите:
[ { "count": 3 } ]
В любом случае, это не будет различать, находятся ли пробелы в кавычках или нет, поэтому это может изменить значение данных json ( "foo bar"
будет преобразован в "foo bar"
, например).
Если вы хотите использовать последовательность \
для экранирования (удаления) символов новой строки, но в противном случае оставьте другие пустые символы без необходимости экранировать символы двойных кавычек, вы можете использовать здесь -document:
json=$(cat <<EOF
[\
{\
"count": 3\
}\
]
EOF
)
echo "$json"
Что даст:
[ { "count": 3 } ]
(новые строки были удалены (вы могли сохранить некоторые из них, не добавляя к ним обратную косую черту), но другие пустые символы остались нетронутыми).
что-нибудь для начала;
$ echo "/tmp/xxx2016/folder123/folder2/folderxxx/test1.jpg" | grep -o "[0-9]*" | tr "\n" "_" | sed 's/_$/.jpg\n/;'
2016_123_2_1.jpg
EDIT, пропустить 2016;
$ echo "/tmp/xxx2016/folder123/folder2/folderxxx/test1.jpg" | grep -o "[0-9]*" | tail -n +2 | tr "\n" "_" | sed 's/_$/.jpg\n/;'
123_2_1.jpg
или
$ echo "/tmp/xxx2016/folder123/folder2/folderxxx/test1.jpg" | grep -o "[0-9]*" | tr "\n" "_" | sed 's/2016_//;s/_$/.jpg\n/;'
123_2_1.jpg