Как удалить пробелы из строки после заданного слова?

Вот один из возможных подходов, который, вероятно, не самый красивый и не самый оригинальный. Идея состоит в том, чтобы использовать регулярные выражения в awk для извлечения соответствующих битов из имен файлов. Затем мы переходим к созданию команды shell move (mv) в awk. Наконец, мы используем системную команду, доступную в awk, для выполнения команды и перемещения файлов в соответствующие подпапки.

Сначала попробуйте следующее, чтобы получить подробное описание:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd }'

Результат:

Command to be run:  mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run:  mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run:  mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02

Для фактического выполнения команды, которую вы добавляете system (cmd) в конце оператора:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'

Единственное, что вам, вероятно, нужно, это чтобы настроить регулярное выражение в соответствии с вашими потребностями. Я предполагаю, что вы знакомы с регулярным выражением, здесь мы записываем две части имен файлов. Группы захвата заключены в круглые скобки.

Начиная с начала имени файла, мы захватываем все, что не является подчеркиванием, пока не найдем одно подчеркивание. Затем мы продолжаем поиск, пока не найдем шаблон A #####, где # представляют буквы / цифры (вторая группа захвата). Мы захватываем, пока не дойдем до следующего символа подчеркивания.

2
09.07.2017, 18:11
3 ответа

Предполагая, что вы уже вставили эти значения в таблицу, вы можете удалить из них символы пробела.

Предположим также, что столбцы в таблице называются c1, c2и c3:

UPDATE x SET c1 = TRIM(c1), c2 = TRIM(c2), c3 = TRIM(c3);

Функция TRIM()функция удалит как начальные, так и конечные пробелы.

Если вы хотите сначала проверить это на временной таблице:

CREATE TEMPORARY TABLE t AS SELECT * FROM x;
UPDATE t SET c1 = TRIM(c1), c2 = TRIM(c2), c3 = TRIM(c3);
SELECT * from t;

... или просто

SELECT TRIM(c1), TRIM(c2), TRIM(c3) FROM x;

, что вообще ничего не изменит в базе данных.


Совет SQL: при вставке значений обязательно упоминайте имена столбцов:

INSERT INTO x (c1, c2, c3) VALUES ('a', 'b', 'c');

Это одновременно служит документацией и позволяет изменять схему таблицы (вставлять новые столбцы или переупорядочивать столбцы) без необходимости поиска и измените каждый оператор INSERTв вашем коде.

2
27.01.2020, 21:55
sed -e ':a' -e "s/\('[^' ]*\)  */\1/g" -e ta  file.txt

insert into x values('a','b','c');
insert into x values('m','n','p');

Мы используем механизм циклов в тандеме, чтобы постепенно очищать пробелы внутри пар одинарных кавычек '...', которые могут быть в строке. Обратите внимание, что предполагается отсутствие табуляций, но с ними также можно работать

sed -e ':a' -e "s/\('[^'[:space:]]*\)[[:space:]]\{1,\}/\1/g" -e ta
2
27.01.2020, 21:55

awk -F '(' '{ gsub(" ","",$2); print $1 FS $2; }' input.txt

Пояснение

  1. Разделить строку на знак '(' -теперь два поля:
    $1 = insert into x values
    $2 = 'a ',' b',' c ');
  2. обработать $2 поле, заменив все пробелы ничем.
  3. сборка новой струны:
    $1(не изменено )+ FS(знак левой скобки )+ $2(обработано, теперь без пробелов ).

Выход:

insert into x values('a','b','c');
insert into x values('m','n','p');
1
27.01.2020, 21:55

Теги

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