создание программы оболочки на bash и вызов файлов в программе и изменение текста [закрыто]

La respuesta de Stephen Kitt cubre el qué e intentaré cubrir por qué se implementó este cambio. Primero, alguien observó que un nombre de archivo que contiene líneas nuevas 1 podría dar como resultado una salida ambigua . Por ejemplo, considere esta salida:

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

¿Significa esto que había dos archivos fooy bar, o solo un archivo cuyo nombre de archivo es "foo\n25af89c92254a806b2e93fffd8ac1814 bar"? Por supuesto, esta última posibilidad es muy poco probable, pero es posible. Para resolver la ambigüedad, los desarrolladores eligieron escapar de las líneas nuevas con una barra invertida(\). La salida entonces se vuelve distinguible. Sin embargo, entonces hay una ambigüedad adicional:

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

¿El nombre de este archivo contiene una nueva línea o una barra invertida seguida de n? Para resolver esto, también debemos escapar de las barras diagonales inversas, de modo que el último caso se convierta en:

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

Finalmente, eligieron anteponer a cada línea de salida que contiene dichos escapes un \\para facilitar que un analizador detecte si se ha realizado un escape. Presumiblemente, esto se hizo para permitir que los analizadores manejen la salida tanto de las versiones de escape de md5sumcomo de las versiones que no -de escape (non -GNU ). La bandera también significa que no es necesario realizar un escape "costoso" -cuando no es necesario. Puede ver un ejemplo de este análisis en acción enmd5sum.cmismo (línea 382 en la versión vinculada ).


1 Por nueva línea me refiero al carácter \nque a veces también se denomina específicamente como avance de línea o LF ; vermd5sum.c.

-3
13.04.2018, 00:25
2 ответа

В вашем сценарии есть несколько недостатков.

for item in * <--do the following action on every item in this directory
do

         if [ -f $item ]  <--if the item is a file then do this
         then 
                sed  's/test/open/g' file.sh  <-- replace "test" with "open" in the file - file.sh
          <--missing closing "fi" statement here
done

Я не совсем уверен, что вы пытаетесь сделать, но если вы хотите заменить каждое вхождение test на open в файле :file.sh, вам, вероятно, следует просто сделать sed 's/test/open/g' file.shв противном случае, если вы хотите заменить его в каждый файл делает это:

#!/bin/bash
#
script=$(basename "$0")
for item in "/path/to/files/"*; do
    if [[ "$item" == "$script" ]]; then
        :
    elif [[ -f "$item" || "${item: -2}" = "sh" ]]; then 
        sed -i 's/test/open/g' "$item"
    fi
done

РЕДАКТИРОВАТЬ

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

1
28.01.2020, 05:19

Давайте сначала проясним некоторые недоразумения:

Что сейчас делает ваш скрипт? Он перебирает каждый элемент в каталоге, где скрипт выполняется (, а не там, где он размещен ). Затем он ищет каждый элемент, независимо от того, является ли он файлом или нет. Если это файл, то он открывает файл file.shи выполняет замену, используя sed.

Что он должен делать:

Вместо открытия file.shпосле каждого истинного утверждения ifон должен открывать фактический элемент.

Что вы можете изменить, чтобы добиться этого:

Заменить file.shв команде sedна$item

-1
28.01.2020, 05:19

Теги

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