Удалите комбинацию чисел и символов из строки, используя способ $ {VARNAME // pattern /}

Как видите, я создал для тестирования следующую структуру:

mkdir test && cd test && touch file1 file2 file3 lol test2
touch -t 200805101024 file*

, получив это:

ls -la
total 8
drwxr-xr-x 2 root   root   4096 Oct 13 18:09 .
drwxr-xr-x 4 phphil phphil 4096 Oct 13 18:09 ..
-rw-r--r-- 1 root   root      0 May 10  2008 file1
-rw-r--r-- 1 root   root      0 May 10  2008 file2
-rw-r--r-- 1 root   root      0 May 10  2008 file3
-rw-r--r-- 1 root   root      0 Oct 13 18:09 lol
-rw-r--r-- 1 root   root      0 Oct 13 18:09 test2

И после выполнения вашей правильной команды:

find . -type f -mtime +5 ! -name 'test2' -exec rm -f {} \;

Ситуация ожидаемая:

ls -la
total 8
drwxr-xr-x 2 root   root   4096 Oct 13 18:09 .
drwxr-xr-x 4 phphil phphil 4096 Oct 13 18:09 ..
-rw-r--r-- 1 root   root      0 Oct 13 18:09 lol
-rw-r--r-- 1 root   root      0 Oct 13 18:09 test2

Изменить: поиск информации о командах или параметрах команд:

Когда я не уверен в поведении определенной команды и / или параметра, я действую следующим образом:

man find | less

, тогда вы можете искать то, что вы ищете в руководстве по команде, как показано ниже:

  • введите /
  • напишите ваши условия поиска, которые, как мне кажется, это -mtime
  • , тогда вы можете перейдите к следующему вхождению вашего поискового запроса, набрав N , или к предыдущему, набрав n

Я нашел эту интересную информацию:

  -mtime n {{1 }} В последний раз данные файла были изменены n * 24 часа назад. См. Комментарии к -atime, чтобы понять, как round - 
ing влияет на интерпретацию времени модификации файла. 
 
2
18.11.2018, 11:45
2 ответа

С kshилиbash -O extglob(или после shopt -s extglobв сценарии bash)илиzsh -o kshglob(или после set -o kshglobв сценарии zsh):

VG_MY=${VG_MY//+(=)+([0-9])+(=)/}

+(...)представляет собой расширенный глобус ksh, аналогичный оператору расширенного регулярного выражения +. +(x)соответствует одному или нескольким xс.

Таким образом, вышеприведенное удаляет все последовательности из одного или нескольких =, за которыми следует одна или несколько десятичных цифр, за которыми следует одна или несколько =, как sed -E 's/=+[0-9]+=+//g'¹.

Не то чтобы 456==не удалось удалить внутри ==123====456==, поскольку первая замена удалит ==123====, оставив что-то, что не соответствует шаблону. Чтобы иметь возможность удалить их, вы можете изменить его на:

VG_MY=${VG_MY//+(=)[0-9]*([0-9=])=/}

(нравитсяsed -E 's/=+[0-9][0-9=]*=//g')

С собственными расширенными глобусами zsh(zsh -o extendedglob):#является эквивалентом ERE *и ##ERE+(#c1,3)из{1,3}). Итак, вы можете сделать:

set -o extendedglob
VG_MY=${VG_MY//=##[0-9]##=##/}

¹ Обратите внимание, что хотя некоторые реализации sedподдерживают -Eдля расширенных регулярных выражений, это еще не стандарт, и иногда вы можете найти некоторые реализации, которые его не поддерживают. С ними вы можете пропустить -Eи использовать \{1,\}в качестве замены BRE для+(или использовать ==*вместо=+).

7
27.01.2020, 21:49

Просто удалите ==94953==в начале каждой строки перед сравнением результатов:

valgrind --leak-check=full./executable1 <inputfile 2>&1 | sed 's/^==[0-9]*== //' >output1
valgrind --leak-check=full./executable2 <inputfile 2>&1 | sed 's/^==[0-9]*== //' >output2

diff -u output1 output2 

В качестве альтернативы, которая позволяет сохранять немодифицированный вывод и изменять его только при запуске diff,

valgrind --leak-check=full./executable1 <inputfile >output1 2>&1
valgrind --leak-check=full./executable2 <inputfile >output2 2>&1

diff -u <( sed 's/^==[0-9]*== //' <output1 ) <( sed 's/^==[0-9]*== //' <output2 )
4
27.01.2020, 21:49

Теги

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