2013-04-09 3 views
-1

У меня есть строка в текстовом файле с большим количеством строк, один, например, является:Изменить определенное поле определенной строки в текстовом файле в Баш

ABCDE: jhdfj $ jhbsfiy/.hghi $ JH: 12345: dgve: 1 :::

Мне нужно, чтобы найти эту строку, abcde хранится в var1. после того, как я разместил, мне нужно изменить только 3-е поле, 12345, и заменить его на переменную var2, не касаясь остальной части. если var2 является 567890, то после этого строка в текстовом файле следует читать:

ABCDE: jhdfj $ jhbsfiy/.hghi $ JH: 567890: dgve: 1 :::

Я предполагаю, что awk является мой друг здесь, но я ноб, у которого не хватит времени!

Это работает, но мне нужно, чтобы сделать это, не касаясь ничего, кроме 3-го поля (Uni назначения помощи):

SED -i "TextFile.txt" -e «с, ($ var1): (*:.): \ 1: $ var2NeedingChange: $ var3, г»textfile.txt

После того, как я имел 1-поле в var1 и 4-й-седьмых поля в var3 в виде строки, но я должен сделать это по-другому. надеюсь, это поможет вам понять, чего я пытаюсь достичь.

+1

более вероятно 'usermod' и' groupmod' являются вашим другом здесь, а также 'vigr' и' vipw' (оба без и с '-s' соответственно) ... – 0xC0000022L

+0

Help? Я ничего не знаю об этих четырех вещах ... –

+0

PLease не задает один и тот же вопрос дважды, но отредактируйте его, если у вас есть дополнительная информация. –

ответ

1
$ var1=abcde 

$ var2=567890 

$ awk -v v1="$var1" -v v2="$var2" '$1==v1{$3=v2}{print $0}' FS=':' OFS=':' file 
abcde:jhdfj$jhbsfiy/.hghi$jh:567890:dgve:1::: 

Примечания:

  • передавать переменные оболочки в awk вам нужно использовать опцию -v.

  • FS специальная переменная разделителя поля awk.

  • OFS специальная переменная разделителя поля выхода awk.

  • Каждое поле в awk является ссылка на $i т.е. поле один опорный путем $1 и имеет значение abcde в вашем примере. Для ссылки на всю строку $0.

  • Блок {$3=v2} устанавливает третье поле для значения переменных awkv2, который установлен с переменной оболочкой $var2.

  • Блок применяется только в том случае, если условие $1==v1 (поле равно awk переменной v1).

  • Второй блок {print $0} не имеет условного обозначения, поэтому применяется к каждой строке в файле. Он просто печатает всю строку.

Если вы хотите сохранить изменения в исходном файле, вам понадобится временный файл.

awk -v v1="$var1" -v v2="$var2" '$1==v1{$3=v2}{print $0}' FS=':' OFS=':' file > t 

mv t file 

Это учебник иначе, ни один стандарт проделки торгового пути:

awk -v a="$var1" -v b="$var2" '$1==a{$3=b}1' FS=: OFS=: file > t && mv t file 

Удачи с Linux!

+0

Спасибо. См. Обновленный вопрос. как мне получить это, чтобы найти строку в текстовом файле и внесут ли она изменения в файл? –

+0

Ahh, я пропустил это –

+0

он работает, спасибо! –

Смежные вопросы