आइए मान लें कि निम्नलिखित रेप्रेप्रो वितरण फ़ाइल:

Origin: git.sdxlive.com/git/PPA
Label: Ubuntu focal
Suite: focal
Version: 20.04
Codename: focal
Architectures: i386 amd64
Components: stable unstable
Limit: 0
Description: Latest Ubuntu focal 20.04 packages
Contents: .gz .bz2
Tracking: keep
SignWith: xxxxxxxxxxxxxxxxxxxx
Signed-By: xxxxxxxxxxxxxxxxxxxx
ValidFor: 2y 6m
Log: packages.Ubuntu.log

Origin: git.sdxlive.com/git/PPA
Label: Ubuntu groovy
Suite: groovy
Version: 20.10
Codename: groovy
Architectures: i386 amd64
Components: stable unstable
Limit: 0
Description: Latest Ubuntu groovy 20.10 packages
Contents: .gz .bz2
Tracking: keep
SignWith: xxxxxxxxxxxxxxxxxxxx
Signed-By: xxxxxxxxxxxxxxxxxxxx
ValidFor: 2y 6m
Log: packages.Ubuntu.log

लक्ष्य 'ओरिजिन:' द्वारा सीमांकित लाइनों के पूरे ब्लॉक और एक खाली लाइन को हटाना है जब इसमें "कोडनेम: ${os_code_name}" लाइन हो, जहां os_code_name एक बैश वैरिएबल है।

तो अपेक्षित आउटपुट है:

Origin: git.sdxlive.com/git/PPA
Label: Ubuntu groovy
Suite: groovy
Version: 20.10
Codename: groovy
Architectures: i386 amd64
Components: stable unstable
Limit: 0
Description: Latest Ubuntu groovy 20.10 packages
Contents: .gz .bz2
Tracking: keep
SignWith: xxxxxxxxxxxxxxxxxxxx
Signed-By: xxxxxxxxxxxxxxxxxxxx
ValidFor: 2y 6m
Log: packages.Ubuntu.log

एक चर कोडनाम के बिना, हम उदाहरण के लिए फोकल कोडनेम से मेल खाने वाले ब्लॉक को हटाने के लिए निम्नलिखित का उपयोग कर सकते हैं:

awk '/^Origin: /{s=x} {s=s $0 RS} /^$/{if(s!~/Codename: focal/) printf "%s",s}' distributions

मुझे एक चर कोडनाम का उपयोग करने का समाधान नहीं मिला; मैंने उपयोग करने की कोशिश की:

  1. --असाइन = var = "$ {os_code_name}"
  2. पर्यावरण ["os_code_name"]

पहले मामले में, मुझे नहीं पता कि awk स्ट्रिंग 'कोडनेम:' और वेरिएबल var के बीच अंतर कैसे कर सकता है, क्योंकि हम "$var" का उपयोग नहीं कर सकते हैं। निम्नलिखित स्पष्ट रूप से काम नहीं करता है:

awk --assign=var="${os_code_name}" '/^Origin: /{s=x} {s=s $0 RS} /^$/{if(s!~/Codename: $var/) printf "%s",s}' distributions

दूसरे मामले में, यह भी असफल है:

awk '/^Origin: /{s=x} {s=s $0 RS} /^$/{if(s!~/Codename: ENVIRON["os_code_name"]/) printf "%s",s}' distributions

मैंने यह उत्तर भी चेक किया।

कोई उपाय?

1
jean-christophe manciot 12 सितंबर 2020, 20:49

2 जवाब

सबसे बढ़िया उत्तर

क्या आप कृपया दिखाए गए नमूनों के साथ निम्नलिखित, लिखित और परीक्षण करने का प्रयास कर सकते हैं और सभी प्रकार के awk में काम करना चाहिए।

os_code_name="focal" ##shell variable
awk -v co="$os_code_name" '
/Origin/{
  if(!foundCo && FNR>1){ print val }
  val=foundCo=""
}
/^Codename/ && $NF==co{
  foundCo=1
}
{
  val=(val?val ORS:"")$0
}
END{
  if(!foundCo){ print val }
}
'  Input_file

स्पष्टीकरण: ऊपर के लिए विस्तृत विवरण जोड़ना।

os_code_name="focal"                     ##This is a shell variable.
awk -v co="$os_code_name" '              ##Starting awk program from here and setting co variable as value of os_code_name here.
/Origin/{                                ##Checking condition if line has Origin string in it then do following.
  if(!foundCo && FNR>1){ print val }     ##Checking condition if foundCo is NULL and FNR>1 then print val here.
  val=foundCo=""                         ##Nullifying variables here.
}
/^Codename/ && $NF==co{                  ##Checking condition if line starts with Codenam and last field is equal to variable.
  foundCo=1                              ##Setting value for foundCo here.
}
{
  val=(val?val ORS:"")$0                 ##Creating val which has all lines values from Origin to just before next occurrence of Origin it either gets printed above or gets NULL.
}
END{                                     ##Starting END block of this awk program from here.
  if(!foundCo){ print val }              ##Checking condition if foundCo is NULL then print val here.
}
'  Input_file                            ##Mentioning Input_file name here.
2
RavinderSingh13 12 सितंबर 2020, 21:28

आप खाली RS का उपयोग कर सकते हैं, यह पैराग्राफ मोड है, और जहां कोडनाम मौजूद है वहां कोई रिकॉर्ड प्रिंट न करें।

awk -v cn="$cn" -v RS="" '!($0 ~ "Codename: " cn){print $0,"\n"}' file

आपके लिंक किए गए उत्तर के तरीके से चर को पारित किया जाना है। पैटर्न मिलान या तो ~ /.../ या ~ "..." का उपयोग करके किया जा सकता है, दोहरे उद्धरण चिह्नों का उपयोग करके आपको यहां क्या करना है, "Codename: " var मिलान स्ट्रिंग है।

1
thanasisp 12 सितंबर 2020, 21:19