Замена символов в каждой строке файла в Linux - PullRequest
1 голос
/ 20 апреля 2019

У меня есть файл с разными словами в каждой строке.Моя цель - заменить первый символ заглавной буквой и заменить третий символ на «#».

Например: футбол будет заменен на -> Foo # ball

Я попытался подуматьоб использовании awk и sed. Это мне не помогло, поскольку (насколько мне известно) sed нуждается в точном вводе символов, и awk может печатать нужный символ, но не изменять его.

Ответы [ 7 ]

4 голосов
/ 20 апреля 2019

С GNU sed и двумя s командами:

echo 'football' | sed -E 's/(.)/\U\1/; s/(...)./\1#/'

Вывод:

Foo#ball

См .: 3.3 Команда s , 5.7 Обратные ссылки и Subexpressions и 5.9.2 Преобразование верхнего / нижнего регистра

3 голосов
/ 21 апреля 2019

Это может сработать для вас (GNU sed):

sed 's/\(...\)./\u\1#/' file
2 голосов
/ 20 апреля 2019

С bash вы можете использовать только расширения параметров для выполнения задачи.Например, если вы читаете каждую строку в переменную line, вы можете выполнить:

line="${line^}"                # change football to Football (capitalize 1st char)
line="${line:0:3}#${line:4}"   # make 4th character '#'

Пример входного файла

$ cat file
football
soccer
baseball

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

$ while read -r line; do line="${line^}"; echo "${line:0:3}#${line:4}"; done < file
Foo#ball
Soc#er
Bas#ball

Хотя оболочка обычно медленнее, когда использование ограничено встроенными функциями, она не сильно отстает.

( примечание: ваш вопрос говорит о 3-м символе, но ваш пример заменяет 4-й символ на '#')

1 голос
/ 21 апреля 2019

С GNU awk для соответствия 3-го аргумента ():

$ echo 'football' | awk 'match($0,/(.)(..).(.*)/,a){$0=toupper(a[1]) a[2] "#" a[3]} 1'
Foo#ball
1 голос
/ 20 апреля 2019

Ответы Кира или Потонга являются предпочтительными. (Для Linux или систем с GNU sed из-за \ U или \ u.)

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

$ echo 'football'|awk '{a=substr($0,1,1);b=substr($0,2,2);c=substr($0,5);print toupper(a)b"#"c}'
Foo#ball

Это самое простое решение без RegEx. Он также будет работать на не-GNU awk.

0 голосов
/ 21 апреля 2019

если ваши данные в файле 'd', попробуйте на gnu sed:

sed -E 's/^(\w)(\w\w)\w/\U\1\E\2#/' d
0 голосов
/ 20 апреля 2019

Это должно работать с любой версией awk:

awk '{
    for(i=1;i<=NF;i++){
        # Note that string indexes start at 1 in awk !
        $i=toupper(substr($i,1,1)) "" substr($i,2,1) "#" substr($i,3)
    }
    print
}' file

Примечание. Если слово имеет длину менее 3 символов, например it, оно будет напечатанокак It#

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