Grep and replace

В дополнение к ответам @ RuiFRibeiro и @ BrureEdiger, вы различаете не только ядро. На самом деле, у вас есть различные типы файлов: обычные файлы, каталоги, символические ссылки, устройства, сокеты (и я всегда забываю несколько, так что я не буду пытаться составить полный список). Вы можете получить информацию о типе файла с помощью ls : это первый символ в строке. Например:

$ls -la /dev/sda
brw-rw---- 1 root disk 8, 0 17 nov.  08:29 /dev/sda

'b' в самом начале сигнализирует, что этот файл является блочным устройством. Тире означает обычный файл, «l» символическая ссылка и так далее. Эта информация хранится в метаданных файла и доступна, например, через системный вызов stat , так что ядро может по-разному считывать файл и символическую ссылку.

Затем вы проводите другое различие между «реальными файлами», такими как /bin/bash , и «виртуальными файлами», такими как /proc/cpuinfo , но ls сообщают как обычные файлы, так что разница в другом:

ls -la /proc/cpuinfo /bin/bash
-rwxr-xr-x 1 root root  829792 24 août  10:58 /bin/bash
-r--r--r-- 1 root wheel      0 20 nov.  16:50 /proc/cpuinfo

Что происходит, так это то, что они принадлежат разным файловым системам. /proc является точкой установки псевдофайловой системы procfs , тогда как /bin/bash находится на обычной дисковой файловой системе. Когда Linux открывает файл (это происходит по-разному в зависимости от файловой системы), он заполняет структуру данных file , которая имеет, среди прочих атрибутов, структуру из нескольких указателей функций, описывающих использование этого файла. Поэтому он может реализовывать различные варианты поведения для различных типов файлов.

Например, это операции, объявленные /proc/meminfo :

static int meminfo_proc_open(struct inode *inode, struct file *file)
{
    return single_open(file, meminfo_proc_show, NULL);
}

static const struct file_operations meminfo_proc_fops = {
    .open       = meminfo_proc_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = single_release,
};

Если вы посмотрите на определение meminfo _ proc _ open , то вы увидите, что эта функция заполняет буфер в памяти информацией, возвращаемой функцией meminfo _ proc _ show , задачей которой является сбор данных об использовании памяти. Эта информация может быть считана в нормальном режиме. При каждом открытии файла вызывается функция meminfo _ proc _ open и обновляется информация о памяти.

-121--15971-
acl ofnoimport urlpath_regex /import/
http_access deny ofnoimport

HTTPS может быть немного сложным, учитывая, что они поступают как запросы CONNECT ...

-121--195066-

Так что здесь в основном есть два различных типа вещей:

  1. Обычные файловые системы, которые содержат файлы в каталогах с данными и метаданными, знакомым способом (включая мягкие ссылки, жесткие ссылки и так далее). Они часто, но не всегда, поддерживаются блочным устройством для постоянного места хранения (tmpfs живет только в оперативной памяти, но в остальном идентичен обычной файловой системе). Семантика этих привычна; читать, писать, переименовывать и так далее, все работают путь вы их ожидаете.
  2. Виртуальные файловые системы различных типов. Примерами здесь являются /proc и /sys , а также пользовательские файловые системы FUSE, такие как sshfs или ifuse . В них гораздо больше разнообразия,потому что на самом деле они просто ссылаются на файловую систему с семантикой, которая в некотором смысле является «пользовательской». Таким образом, при чтении из файла по пути /proc вы фактически не получаете доступ к определенной части данных, которая была сохранена другим способом записи ранее, как в обычной файловой системе. По сути, вы делаете вызов ядра, запрашивая некоторую информацию, которая генерируется на лету. И этот код может делать все, что угодно, так как это просто какая-то функция, где-то реализующая чтение семантики. Таким образом, у вас есть странное поведение файлов под /proc , как, например, притворяться symlinks, когда они не являются на самом деле.

Ключ заключается в том, что /dev на самом деле, как правило, является одним из первых видов. В современных дистрибутивах нормально иметь /dev что-то вроде tmpfs, но в старых системах было нормально иметь на диске обычный каталог, без каких-либо специальных атрибутов. Ключ заключается в том, что файлы в /dev являются узлами устройств, типом специального файла, похожим на FIFO или сокеты Unix; узел устройства имеет мажорный и минорный номера, и чтение или запись их делает вызов драйвера ядра, так же как чтение или запись FIFO вызывает ядро для буферизации выходных данных в канале. Этот драйвер может делать все, что хочет, но обычно он каким-то образом затрагивает аппаратные средства, например, доступ к жесткому диску или воспроизведение звука в динамиках.

Чтобы ответить на первоначальные вопросы:

  1. Есть два вопроса, имеющих отношение к тому, существует ли «файл» или нет; это то, существует ли файл узла устройства в буквальном смысле и имеет ли значение код ядра, поддерживающий его. Первый разрешен точно так же, как и все в обычной файловой системе. Современные системы используют udev или что-то подобное для наблюдения за аппаратными событиями и автоматического создания и уничтожения узлов устройства под /dev соответственно. Но старые системы, или легкие пользовательские сборки, могут просто иметь все свои узлы устройств буквально на диске, созданном раньше времени. Тем временем, при чтении этих файлов выполняется вызов кода ядра, который определяется номерами мажорных и второстепенных устройств; Если это не разумно (например, вы пытаетесь прочитать блочное устройство, которое не существует), вы просто получите какую-то ошибку ввода-вывода.

  2. Способ определения кода ядра, вызываемого для файла устройства, варьируется. Для виртуальных файловых систем, таких как /proc , они реализуют собственные функции read и write ; ядро просто вызывает этот код в зависимости от того, в какой точке монтирования он находится, и реализация файловой системы обеспечивает восстановление.

0
07.06.2018, 09:55
3 ответа

El comando sedes mejor.

sed -i 's/RESOURCE=Lnreddy37@gmail.com/RESOURCE=reddy17777@gmail.com/' yourfile

Lo anterior funciona en mi prueba, pero si quieres probarlo por ti mismo, puedes probar este primero:

sed 's/RESOURCE=Lnreddy37@gmail.com/RESOURCE=reddy17777@gmail.com/' yourfile

Eso escribirá los cambios en la salida estándar sin afectar el archivo.

De cualquier manera, le da el cambio deseado de:

RESOURCE=reddy17777@gmail.com

Si el valor de RESOURCEes diferente en el archivo y desea cambiarlo por algo diferente, entonces:

grep RESOURCE= yourfile

Eso devolverá la línea donde está y mostrará el valor.

A continuación, puede utilizar

sed 's/RESOURCE=existingemail@gmail.com/RESOURCE=emailyouwant@gmail.com/' yourfile

Para futuras referencias, es importante aclarar todo esto en su pregunta original para que pueda obtener la ayuda que necesita sin todo este galimatías.

0
28.01.2020, 02:43

grep no es útil en este caso ya que no permite modificar el contenido del archivo.

En cambio, uno puede usar sedasí:

fromaddr='Lnreddy37@gmail.com'
toaddr='reddy17777@gmail.com'

sed '/^RESOURCE=/s/='"$fromaddr"'$/='"$toaddr"'/' file >newfile

Dado filecomo

some data
RESOURCE=Lnreddy37@gmail.com
RESOURCE2=Lnreddy37@gmail.com
RESOURCE=Lnreddy37@example.com
RESOURCE=Lnreddy38@gmail.com
more data

esto crea newfilecomo

some data
RESOURCE=reddy17777@gmail.com
RESOURCE2=Lnreddy37@gmail.com
RESOURCE=Lnreddy37@example.com
RESOURCE=Lnreddy38@gmail.com
more data

La expresión sedseleccionará líneas que comiencen con la cadena RESOURCE. Para cada una de esas líneas, reemplazará la dirección de correo electrónico, si está presente en la línea. El patrón utilizado para la sustitución asegura que coincidamos con el =y que la dirección termine al final de la línea.

1
28.01.2020, 02:43

Parece que estás diciendo que desea reemplazar la cadena que aparece después de =, no importa lo que sea por ejemplo , en los datos de muestra, desea reemplazar Lnreddy37@gmail.com. Pero está diciendo que, sin importar cuál sea la cadena después de =, desea reemplazarlo con reddy17777@gmail.com— aparentemente quieres eso codificado.

Hay algunas variaciones sobre cómo hacer esto. El más simple es

sed 's/RESOURCE=.*/RESOURCE=reddy17777@gmail.com/'

que (gustan todos los siguientes comandos )utiliza el hecho de que .*significa "coincidir con lo que esté allí". Si no desea escribir RESOURCE=dos veces, puede acortar lo anterior a

sed 's/\(RESOURCE=\).*/\1reddy17777@gmail.com/'

donde \(\)marca una parte de la cadena de búsqueda como un grupo (puede tener hasta nueve grupos )y \1significa reemplazar con el primer grupo.

Los comandos anteriores buscarán y reemplazarán RESOURCE=dondequiera que aparezca en la línea. Entonces, por ejemplo, la entrada

# Lakshminarayana wants to change all occurrences of "RESOURCE=".
RESOURCE=john@yahoo.com
COORDINATOR=paul@hotmail.com
MUSIC_RESOURCE=nasir37@yahoo.com
FOX RESOURCE=The quick brown fox
# Comment: Originally line 2 said RESOURCE=ringo@liverpool.co.uk

se cambiaría a

# Lakshminarayana wants to change all occurrences of "RESOURCE=reddy17777@gmail.com
RESOURCE=reddy17777@gmail.com
COORDINATOR=paul@hotmail.com
MUSIC_RESOURCE=reddy17777@gmail.com
FOX RESOURCE=reddy17777@gmail.com
# Comment: Originally line 2 said RESOURCE=reddy17777@gmail.com

Si desea hacer coincidir solo cuando aparece RESOURCE=al comienzo de una línea, usar^:

sed 's/^RESOURCE=.*/RESOURCE=reddy17777@gmail.com/'

o

sed 's/^\(RESOURCE=\).*/\1reddy17777@gmail.com/'

Si desea reemplazar solo el valor del recurso, y no todo el resto de la línea, por ejemplo,

RESOURCE=Lnreddy37@gmail.com    TALENT=george@hotmail.com

a

RESOURCE=reddy17777@gmail.com   TALENT=george@hotmail.com

eso también se puede hacer. Edite su pregunta para decir exactamente lo que quiere, con explicaciones completas y claras y ejemplos.


OK, elija uno de los comandos anteriores s. Ahora, si desea editar su archivo en el lugar (como ha indicado ), haga

sed  -i  {s command }  { yourfile }

Si desea producir un nuevo archivo, haga

sed  {s command }  { oldfile }  >  { newfile }

En realidad, no escriba{y}; están allí sólo para la demarcación.

0
28.01.2020, 02:43

Теги

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