Если я правильно понял ваш вопрос, следующая замена должна делать то, что вы хотите:
%s/\[\[\(\d\+\)\([_ ]\)Week\([_ ]\)\(\d\+\)\]\],\(\s\d\+\w\+.*\)/[[\1\2Week\3\4|Week \4,\5]]/
Обратите внимание, :группы захвата \([_ ]\)
сохраняют разделитель (пробел или подчеркивание )для компонентов, которые появляются перед|
(разделителем является пробел для строки 5, в то время как подчеркивание используется в строках 8 -13 ).
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ :Это ни в коем случае не лучший способ сделать это или по каким-либо меркам лучший подход, но он показывает, как думать об этих типах проблем, если вы просто выполняете один раз что-то вроде этого, это нормально, но никогда не должен использоваться кем-то другим, кроме человека, пишущего сценарии, т.е. НЕ ставьте на компьютер, который используют другие. Основной принцип состоит в том, что большинство работ кажется простым, если разбить их на мельчайшие этапы.
Я оставил все итерации в этом посте, чтобы вы могли увидеть, как очень простые изменения могут изменить результат, и сравнить их. Трудность возникает, когда вам нужно начать тестирование входных данных, ни один из которых не присутствует, то есть код, который сделал бы это чем-то полезным, т.е. добавление ввода для разных имен файлов, добавление нескольких проверок входных аргументов и т. д. Опять же, я повторяю, что это нормально делать такие вещи как одноразовые, но никогда не следует использовать их в качестве полного ответа на что-то, что носит повторяющийся характер.
#!/bin/bash
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded$n
cat pair_$n >> combinded$n
mv combinded$n $(echo combinded$n | sed 's/doc//g')
done
При этом будут взяты файлы с именами docA.csv
и pair_docA.csv
и объединены в один файл с именем combinedA.csv
, оставив оригиналы нетронутыми. Это будет сделано для всех файлов в каталоге, использующих один и тот же шаблон именования.
ПРИМЕЧАНИЕ. :Это должно выполняться в каталоге, в котором находятся файлы, и файлы должны называться так, как они здесь указаны.
ТЕСТИРОВАНИЕ:
документ _A.csv документ _B.csv пара _docA.csv пара _docB.csv
ВЫХОД:
combindedA.csv combindedB.csv
РЕДАКТИРОВАТЬ :Чтобы ответить на ваш вопрос о выводе всего в один файл, это будет сделано в файл с именемcombinded.csv
#!/bin/bash
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded.csv
cat pair_$n >> combinded.csv
done
Это выведет в один файл в таком формате:
ЭСТ. до конца файла.
РЕДАКТИРОВАТЬ :Чтобы добавить каталог в качестве входных и выходных данных, становится немного сложнее, вам нужно проверить аргументы, этот скрипт принимает два аргумента: первый — это каталог, содержащий файлы, а второй аргумент — это расположение выходных данных. file оба аргумента ОБЯЗАТЕЛЬНЫ.
#!/bin/bash
dir=$1
out=$2
cd $1
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded$n
cat pair_$n >> combinded$n
mv combinded$n $out/$(echo combinded$n | sed 's/doc//g')
done
ПРИМЕР :./script.sh /path/to/files /path/to/output
НЕОБХОДИМЫ ОБА АРГУМЕНТА
set -x
DIR=/path/to/file/location
TMPDIR=$(mktemp -d)
rm -f -- "$DIR/combined.csv"
for file in "$DIR"/doc?.csv
do
doc=${file##*/}
#------------ doc processing
temp_doc="$TMPDIR/$doc"
your_code "$file" > "$temp_doc"
#------------- pair doc processing
pair="$DIR/pair_$doc"
temp_pair="$TMPDIR/$pair"
your_code "$pair" > "$temp_pair"
#--------- combine doc+pair
combined="$DIR/combined${doc/doc/}"
your_code "$temp_doc" "$temp_pair" > "$combined"
cat "$combined" >> "$DIR/combined.csv"
done
Примечание :замените свои коды обработки в трех шагах выше
документ=${файл ##*/} Вышеупомянутая конструкция удаляет до последней / начиная слева в переменной оболочки $file. Помните, что у него есть головная часть $DIR. Нам просто нужно простое базовое имя для этого и сохранить результат в другой переменной оболочки $doc.
Чтобы объединить все в один файл, я добавил последнюю строку cat.