Написать скрипт оболочки для замены номера телефона из файла - PullRequest
0 голосов
/ 23 января 2020

У меня есть файл с именем test.txt, и содержимое этого файла:

abc,123456,india
dfg,78910,china
abc,893948,japan
abc,892389,australia

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

#!/bin/bash

for line in $(cat /tmp/file.txt)
do
    i=$(echo $line|grep XYZ |awk -F, '{print $2}')
    while ( $i )
    do
        sed -i 's/$i/00070/g';
    done
done

Ответы [ 4 ]

2 голосов
/ 23 января 2020

Поскольку вы сказали "только в bash", вот упрощенное решение c all- bash.

$: while IFS=, read name number country
>  do case "$name" in
>     abc) echo "$name,00070,$country"   ;;
>       *) echo "$name,$number,$country" ;;
>     esac
>  done < infile
abc,00070,india
dfg,78910,china
abc,00070,japan
abc,00070,australia

Хотя лучше просто использовать sed -

$: sed '/^abc,/s/,[^,]*,/,00070,/' in
abc,00070,india
dfg,78910,china
abc,00070,japan
abc,00070,australia

Скрипт вообще не нужен.

Объяснено:

/^abc/ говорит "для каждой записи, которая начинается (^) с abc, выполните следующее ...

s объявляет замена первой части второй частью.

,[^,]*, (первая часть) говорит, что найти запятую, за которой следует любое количество не запятых (^ внутри [...] означает «не эти») , затем еще одна запятая

, затем во втором разделе говорится, чтобы заменить все, что мы нашли в первом разделе, на литерал ,00070,.

Если вы хотите написать это как скрипт, вы можете передать в строках триггера и замены ...

 #! /usr/bin/bash
 sed "/^$1,/s/,[^,]*,/,$2,/" $3

Затем запустите его:

$: ./tst abc 00070 infile
abc,00070,india
dfg,78910,china
abc,00070,japan
abc,00070,australia

$: ./tst dfg 987654321 infile
abc,123456,india
dfg,987654321,china
abc,893948,japan
abc,892389,australia

Затем вы можете начать добавлять такие вещи, как проверка ошибок, ограничения для значений, непозиционные аргументы с getopts, et c ... но здесь у вас есть быстро работающий шаблон.

(Если у вас есть весь файл имени / номера для изменения в целевом файле, тогда ищите ассоциативные массивы - don ' сделать это как вложенный l oop, который редактирует весь файл один раз для каждой записи в другой файл. Это можно сделать за один проход.)

2 голосов
/ 23 января 2020

Вы просто пытаетесь сделать второй столбец каждой строки строкой "00070"? Вместо того, чтобы перебирать файл с временем l oop, просто позвольте итерации sed, поскольку это то, что он делает. например, sed 's/\([^,]*\),[^,]*,/\1,00070,/'. Но sed - неправильный инструмент, и вы должны просто сделать:

awk '{$2="00070"}1' FS=, OFS=, /tmp/file.txt

РЕДАКТИРОВАТЬ: учитывая конкретность в комментарии. Чтобы ограничить замену, просто выполните:

awk '$1 ~ /abc/ {$2="00070"}1' FS=, OFS=, /tmp/file.txt
1 голос
/ 24 января 2020
awk 'BEGIN{FS=OFS=","}!/dfg/{$2="00070"}1' file
abc,00070,india
dfg,78910,china
abc,00070,japan
abc,00070,australia
1 голос
/ 23 января 2020

Например, вы можете использовать awk:

awk -F"," '{ print $1=="abc" ? $1",00070,"$3 : $0 }' test.txt

-F задает разделитель (запятая)

Или, если вам нужно заменить его любой другой строкой:

#!/bin/sh
REPLACE=00070
if [ "$1" != '' ] ; then
    REPLACE=$1
fi

awk -F"," "{print (\$1==\"abc\" ? \$1\",$REPLACE,\"\$3 : \$0 }" test.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...