Добавить путь к имени файла

В

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    }  ]

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

2
27.11.2016, 04:20
1 ответ

что-нибудь для начала;

$ 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
0
27.01.2020, 22:44

Теги

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