Команда Linux sed заменяет две строки с пробелами и специальными символами, используя регулярное выражение

Вам действительно не нужен временный файл.

awk -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile

Первая часть выражения делает то, что вы делаете, используя tr . Вторая часть объединяет поля 2-4, переводит их в нижний регистр и печатает вместе с двумя другими полями.

Для вашего ввода он выдаст:

45008657|a.long|0
49210987|a.steven|3262
49600694|a.steven|4772
467814|a.rafealnadal|4133
53111047|a.miketyson|13484

GNU awk 4.1.0 и выше поддерживает редактирование на месте. Вы можете сказать:

awk -i inplace -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile
0
12.01.2019, 03:12
3 ответа

Я думаю, вы ищете это как команду sed:

sed -i.backup '/list-value/{N;N;s/example-value-123/example-value-changed-567/}' file.json

Пример:

$ cat./file.json
"list-value": {
    "object-value": {
        "value": "example-value-123"
    }
}
"list-value-2": {
    "object-value": {
        "value": "example-value-123"
    }
}

# please note this creates a backup file: file.json.backup
$ sed -i.backup '/list-value/{N;N;s/example-value-123/example-value-changed-567/}' file.json

$ cat./file.json
"list-value": {
    "object-value": {
        "value": "example-value-changed-567"
    }
}
"list-value-2": {
    "object-value": {
        "value": "example-value-123"
    }
}
2
28.01.2020, 02:18

Вложенные структуры, а именно JSON, должны обрабатываться (структурными подпрограммами JSON ). Всякий раз, когда вы пытаетесь обработать его с помощью (нескольких )строк -, поддерживающих только подпрограммы, вы всегда будете подвергаться ложным -срабатываниям.

Таким образом, ваш запрос (еще раз, поскольку его правильно сформированный JSON )легко достижим с помощьюjtc:

bash $ jtc -w'[list-value]<value>l' -u'"example-value-changed-567"' file.json
{
   "list-value": {
      "object-value": {
         "value": "example-value-changed-567"
      }
   }
}
bash $ 
0
28.01.2020, 02:18

Предполагая, что документ JSON правильно отформатирован, как

{
  "list-value": {
    "object-value": {
      "value": "example-value-123"
    }
  }
}

jqможно использовать для изменения значения:

$ jq '."list-value"."object-value".value="example-value-changed-567"' file.json
{
  "list-value": {
    "object-value": {
      "value": "example-value-changed-567"
    }
  }
}

Результат может быть перенаправлен в новый файл, и этот файл может заменить исходный файл, если вы захотите его изменить:

tmpfile=$(mktemp)
cp file.json "$tmpfile"
jq '."list-value"."object-value".value="example-value-changed-567"' "$tmpfile" >file.json
rm "$tmpfile"

Я бы не стал анализировать формат структурированного документа, такой как JSON (или XML, YAML, HTML и т. д. )с помощью инструмента, ориентированного на строку -, такого как sed. Если есть синтаксический анализатор формата, который вы можете использовать, используйте его. Парсеры для JSON доступны на всех основных языках программирования. Это делает ваш код более надежным, поскольку вам не нужно заботиться о фактическом форматировании или кодировке символов, используемых во входных данных. Обратите внимание, например, что ваш документ эквивалентен

{ "list-value": {
    "object-value": { "value": 
"example-value-123"
    }
  }
}
2
28.01.2020, 02:18

Теги

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