Поскольку вы на самом деле не меняете строку" cast ":
sed '/cast \$recv \$UE_CAPABILITY_ENQUIRY/{a\
set trans_id 1
n;d}' file
Как комментирует Кусалананда, эта команда :
a
вставьте новую строку n
ext строка из файла (нежелательная строка "set") d
elete it Оглядываясь назад, это не подтверждает, что строка удаления - это та, которую вы хотите удалить. Я бы изменил это на:
sed '
/cast \$recv \$UE_CAPABILITY_ENQUIRY/ {
n
/set trans_id \[ string range \$recv 42 43 \]/ {
i\
set trans_id 1
d
}
}
' file
Для файлов рекурсивно:
find . type f | xargs sed -i '' -e '...'
Более безопасно с инструментами GNU
find . type f -print0 | xargs -0 sed -i '' -e '...'
Помимо блокировки самого файла, вы можете создать файл, используемый как блокировку (файл блокировки). Для этого есть множество утилит, например procmail
имеет файл блокировки
, а в Debian пакет liblockfile-bin
имеет файл блокировки
. Procmail должен быть достаточно распространенным, чтобы быть доступным в большинстве систем.
Но в основном это сводится к примерно так:
tempfile=$(mktemp ./lock.XXXX)
lockfile=./lockfile
if ln $tempfile $lockfile ; then
echo got it
# do something
rm $lockfile # after you're done
else
echo did not succeed
fi
rm $tempfile
ln
не будет сбивать цель, если она уже существует, в отличие от чего-то вроде echo> file
, вместо этого вы получите сообщение об ошибке, которое вы можете проверить .
ПРИМЕЧАНИЕ: , если вы хотите блокировать NFS , используйте какой-нибудь инструмент, созданный для этой цели. Семантика одновременного доступа к файлам через NFS ... по меньшей мере интересна.