Удалить символы из каждой строки файла в оболочке - PullRequest
2 голосов
/ 21 октября 2019

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

Что у меня есть - $ sample_variable -

Data 0 start; 1 ABCD0;2 EFGH0;3 IJKL0;4 MNOP0;5 QRST0;6 end;

Что я хочу -

start
ABCD0
EFGH0
IJKL0
MNOP0
QRST0
end

Код, который я написал-

IFS=$';' 
for j in $sample_variable
do  
    j=$j | cut -d ' ' -f3-
    echo $j
    j=${j// /''}
    echo $j
    echo $j >> output.txt
done

Я записываю вывод в текстовый файл. Но файл записывается как output.txt -

start
1ABCD0
2EFGH0
3IJKL0
4MNOP0
5QRST0
6end

Как удалить числа, встречающиеся натакже начало?

Ответы [ 4 ]

1 голос
/ 23 октября 2019

Следующий код решает проблему -

i=0
IFS=$';' 
for j in $sample_variable
do 
    j=${j// /''}
    j=$(echo "$j" | tr -d [$i] | tr -d ["\n"])
    echo "$j" >> output.txt
    i=$((i+1))
done
}

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

1 голос
/ 21 октября 2019

Если бы вы пытались удалить все цифры, я бы сказал, что вы можете попробовать использовать инструмент tr, например:

IFS=$';' for j in $sample_variable do j=$j | cut -d ' ' -f3- echo $j j=${j// /''} echo $j | tr -d [:digit:] echo $j | tr -d [:digit:] >> output.txt done

Однако, если вы хотите удалить толькодля начальных цифр вам понадобится более универсальный инструмент, например sed, он будет выглядеть так:

IFS=$';' for j in $sample_variable do j=$j | cut -d ' ' -f3- echo $j j=${j// /''} echo $j | sed -e 's/^[0-9]\?//' echo $j | sed -e 's/^[0-9]\?//' >> output.txt done

1 голос
/ 22 октября 2019

Вы также можете найти sed удобным,

sample_data="Data 0 start 1 ABCD0;2 EFGH0;3 IJKL0;4 MNOP0;5 QRST0;6 end"
sed -e 's/^[^0]*0\ //' -e 's/;/\n/g' -e 's/\(^[^0-9][^0-9]*\ \)/\1\n/' -e 's/\ //g'

Пример использования / Вывод

$ sample_data="Data 0 start 1 ABCD0;2 EFGH0;3 IJKL0;4 MNOP0;5 QRST0;6 end"
> echo "$sample_data" |
> sed -e 's/^[^0]*0\ //' -e 's/;/\n/g' -e 's/\(^[^0-9][^0-9]*\ \)/\1\n/' -e 's/\ //g'
start
1ABCD0
2EFGH0
3IJKL0
4MNOP0
5QRST0
6end
0 голосов
/ 21 октября 2019

Вам также необходимо удалить все перед пробелом:

j=${j//* /''}

'' не требуется.

j=${j//* /}

* соответствует любому количеству любых символов,Так что если у j есть два пробела, то он удалит все перед и включая второй пробел. В зависимости от ваших потребностей может быть лучше использовать:

j=${j##* }

или

j=${j#* }

См. Расширение параметров оболочки в bash .

Itможет быть лучше прочитать переменную в массиве и затем обработать ее:

sample_variable='1 ABCD;2 EFGH;3 IJKL;4 MNOP;5 QRST;'
IFS=';' read -r -a arr <<<"$sample_variable"

Затем вы можете разделить переменную, игнорируя все перед первым пробелом:

for j in "${arr[@]}"; do
     j=${j//* /}
     echo "$j"
done

Но япросто сделает следующее, но он оставит одну пустую завершающую новую строку, поэтому может потребоваться sed '$d' - удалить последнюю строку:

<<<"$sample_variable" tr ';' '\n' | cut -d' ' -f2- | sed '$d'

Примечания:

  • j=$j | cut -d ' ' -f3- не делает то, что вы думаете, что делает. Он выполняет j=$j, который устанавливает переменную для себя. Затем он выполняет cut -d ' ' -f3- без ввода, потому что присвоение не печатает никакого вывода.
  • Не забывайте всегда заключать в кавычки ваши расширения переменных.
...