Команда Unix, чтобы проверить, существует ли слово, тогда замените слово, оставьте как есть - PullRequest
0 голосов
/ 28 января 2019

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

Ввод

Amount:{12},members:{2,state:{'xx'},city:{'yyyy'}`enter code here`
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6,state:{'xx'},city:{'yyyy'}

Если в строке есть слово members, то ,state: следует заменить на },state:, если ещеслово members отсутствует в строке, затем не вносите изменений в строку.

Вывод

Amount:{12},members:{2},state:{'xx'},city:{'yyyy'}
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6},state:{'xx'},city:{'yyyy'}`

Я пробовал это sed -i -e '/members/ s/,state/},state/; s/,state/,state'

Спасибо`

Ответы [ 3 ]

0 голосов
/ 28 января 2019

С sed, пожалуйста, попробуйте:

sed 's/\(members.*\)\(,state:\)/\1}\2/' input.txt
0 голосов
/ 28 января 2019

Ваша собственная попытка на самом деле может сработать, просто немного измените, чтобы сделать ее правильной:

$ cat file
Amount:{12},members:{2,state:{'xx'},city:{'yyyy'}`enter code here`
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6,state:{'xx'},city:{'yyyy'}

$ sed -e '/members/ s/,state/},state/;' file
Amount:{12},members:{2},state:{'xx'},city:{'yyyy'}`enter code here`
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6},state:{'xx'},city:{'yyyy'}

Или используйте perl:

perl -pe 's/,state/}.state/ if /members/' file

Вы можете добавить переключатель -iк обоим, когда вы уверены, что результаты соответствуют вашим ожиданиям.
Переключатель Добавить -i изменит входные файлы на месте.

0 голосов
/ 28 января 2019

Проходит два прохода, но делает свое дело.

#!/bin/bash

check=$(<input.txt)
match=",state:"
repl="},state:"
recheck="${check//$match/$repl}"
match="}}"
repl="}"
final="${recheck//$match/$repl}"
echo "${final}" > input2.txt

Вы можете ввести его прямо в командной строке или создать сценарий оболочки .sh и запустить его локально с помощью

chmod +x fix_state.sh
./fix_state.sh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...