замените:
$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt $
следующим:
$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm\{\1\}/g' a.txt
Это должно работать
Вот довольно простой и понятный сценарий оболочки, который использует jsonpipe , чтобы делать то, что вы хотите. Он не использует никаких причудливых функций sh / bash и выполняет только минимальную проверку корректности имен файлов.
ПРИМЕЧАНИЕ. jq гораздо более эффективен, чем jsonpipe
, но jsonpipe
проще и удобнее использовать, когда вам не особенно важно (или вы хотите знать) о структуре данных json и вы хотите извлечь только одно или два поля и / или хотите использовать данные json с инструментами строчно-ориентированной обработки текста, такими как awk
, sed
, grep
и т. Д.
Одним из очевидных возможных улучшений является использование printf
с заполненным нулями целочисленным полем для переименования файлов в пронумерованные имена с фиксированной шириной, например Untitled-0001.txt
вместо Untitled-1.txt
. Я оставлю это тебе, если ты этого хочешь.
Как написано, он фактически не переименовывает ни один файл. Будет выведена только команда mv
, которую он будет использовать . Измените его, чтобы удалить echo
перед каждой командой mv
, чтобы он фактически переименовал файлы.
#! /bin/sh
for f in file*.txt ; do
b=$(basename "$f" .txt)
# ignore current .txt file if there's no matching .json file
if [ -e "$b.json" ] ; then
# extract the title field.
title=$(jsonpipe < "$b.json" |
awk -F'\t' '$1=="/title" {gsub(/\"/,"",$2) ; print $2}')
if [ -n "$title" ] ; then
if [ ! -e "$title.txt" ] ; then
echo mv -v "$f" "$title.txt"
else
# are there any other "$title-*.txt" filenames?
others=$(find . -maxdepth 1 -name "$title-*.txt")
if [ -z "$others" ] ; then
echo mv -v "$f" "$title-1.txt"
else
# use version-sort to get highest $title- number used.
highest=$(printf "%s\n" "$others" | sort -V | tail -n 1)
hnum=$(printf "%s\n" "$highest" | sed -e 's/^.*-// ; s/\.txt$//')
hnum=$(( highest_num + 1))
echo mv -v "$f" "$title-$hnum.txt"
fi
fi
fi
fi
done
Примеры использования / Доказательство того, что это работает:
$ ls -l
total 8
-rw-rw-r-- 1 cas cas 132 May 19 23:47 file1.json
-rw-rw-r-- 1 cas cas 0 May 20 00:04 file1.txt
-rwxrwxr-x 1 cas cas 797 May 20 00:04 json-rename.sh
$ cat file1.json
{"ago": "59 sec ago", "base_time": 1401243133, "title": "Untitled",
"type": "None", "retrieval_time": 1401624105, "id": "qwNAgvYZ"}
$ ./json-rename.sh
mv -v file1.txt Untitled.txt
$ touch Untitled.txt
$ ./json-rename.sh
mv -v file1.txt Untitled-1.txt
$ touch Untitled-1.txt
$ ./json-rename.sh
mv -v file1.txt Untitled-2.txt
$ touch Untitled-999.txt
$ ./json-rename.sh
mv -v file1.txt Untitled-1000.txt