заключать числа в двойные кавычки - PullRequest
1 голос
/ 16 апреля 2020

У меня есть файл с примерами данных ниже, и я пытаюсь заключить числа только в двойные кавычки. Но мне нужно сделать это для чисел, чисел с префиксом +, но не для чисел с алфавитами.

file.txt

- apple_docue:
     lp_from: +91
     lp_toNum: 041
     lp_realm: Madci99

Я пробовал ниже sed, но это выглядит как + «91», а Мадчи «99». Я хочу поставить эти цифры с префиксом + в кавычках, но не те, которые начинаются с алфавитов.

sed 's/[0-9]\{1,\},\?$/"&/g' | sed '/[0-9]\{1,\}$/s/[0-9]\{1,\}/&"/g' file.txt

failed result:

- apple_docue:
     lp_from: +"91"
     lp_toNum: "041"
     lp_realm: Madci"99"

Но это не ожидаемый выход для меня.

ожидаемый результат:

- apple_docue:
     lp_from: "+91"
     lp_toNum: "041"
     lp_realm: Madci99

, пожалуйста, помогите.

заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

РЕДАКТИРОВАТЬ: В соответствии с комментарием @anubhava сэра в случае, если последнее поле имеет значение ", чтобы позаботиться об этом крайнем случае, можно попробовать:

awk -v s1="\"" '
{
  spaces=""
  match($0,/^ +/);
  spaces=substr($0,RSTART,RLENGTH)
  $NF=$NF!~/[a-zA-Z]/?s1 $NF s1:$NF
  gsub(/^\"+|\"+$/,"\"")
  $0=spaces $0
}
1
' Input_file


Не могли бы вы попробовать следующее, это также позаботится о разнесении в строках.

awk -v s1="\"" '{val="";val=$NF!~/[a-zA-Z]/?s1 $NF s1:$NF;sub($NF"$",val)} 1' Input_file

ИЛИ добавление здесь формы решения не на один лайнер.

awk -v s1="\"" '
{
  val=""
  val=$NF!~/[a-zA-Z]/?s1 $NF s1:$NF
  sub($NF"$",val)
}
1
'  Input_file

Объяснение: Добавление подробного объяснения выше.

awk -v s1="\"" '                         ##Starting awk program from here and setting variable s1 as " value here.
{
  val=""                                 ##Nullifying value of val here.
  val=$NF!~/[a-zA-Z]/?s1 $NF s1:$NF      ##Checking if last field is having alphabets then keep it as it is OR add " to before and after its value.
  sub($NF"$",val)                        ##Substituting last column value with variable val value here.
}
1                                        ##1 will print edited/non-edited lines here.
'  Input_file                            ##Mentioning Input_file name here.
2 голосов
/ 16 апреля 2020

Вы можете использовать это sed:

sed -E 's/([[:blank:]])([-+]?[0-9]+)/\1"\2"/' file

- apple_docue:
     lp_from: "+91"
     lp_toNum: "041"
     lp_realm: Madci99

В качестве альтернативы , вы можете использовать awk для проверки номера c последнее поле и заключите в кавычки соответственно:

awk '$NF == $NF+0 { sub($NF "$", "\"" $NF "\"") } 1' file

- apple_docue:
     lp_from: "+91"
     lp_toNum: "041"
     lp_realm: Madci99
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...