Regex is not matching pattern, only the individual parts - regex

I am trying to search for this expression:
<main([\w\W]*)list-unstyled([\w\W]*)</main>
This expression works perfectly in Sublime Text, Notepad++ Etc, and does exactly what I want. Look between for list-unstyled.
My script below works with: list-unstyled, <main, </main>, <main([\w\W]*), ([\w\W]*)</main>
but not <main([\w\W]*)</main> , let alone what I really want, <main([\w\W]*)list-unstyled([\w\W]*)</main> , or better yet
<main([\w\W]*)$pattern([\w\W]*)</main>
How can I get it to work with that expression?
This is my code so far:
param(
[string]$pattern,
[string]$path
)
Get-ChildItem -path $path -Recurse -Filter *.html |
Select-String $pattern |
Group-Object Path |
ForEach-Object{
$props = #{
File = $_.Group | Select-Object -First 1 -ExpandProperty Path
PatternFound = ($_.Group | Select-Object -ExpandProperty LineNumber) -join ";"
}
New-Object -TypeName PSCustomObject -Property $props
}
Sample code from a page
<main class="col-md-9 col-md-push-3" property="mainContentOfPage" role="main">
<h1 property="name" id="wb-cont">Divulgation d’opérations à déclarer </h1>
<div class="wb-share text-right mrgn-tp-lg mrgn-bttm-lg"></div><h2>Le saviez-vous?</h2>
<p>Les opérations à déclarer doivent être divulguées à l’Agence du revenu du Canada (ARC).</p>
<h2>Qu’est-ce qu’une opération à déclarer?</h2>
<p>Il s’agit d’un type particulier d’évitement fiscal qui consiste en une opération menée seule, ou dans le cadre d’une série d’opérations, et visant à éviter de payer de l’impôt. Elle doit répondre à au moins deux des trois critères suivants :</p>
<ol>
<li>Le promoteur ou le conseiller fiscal de l’opération a le droit de recevoir des honoraires qui sont fondés sur ce qui suit :
<ol class="lst-lwr-alph">
<li>le montant de l’avantage fiscal;</li>
<li>l’obtention de l’avantage fiscal;</li>
<li>le nombre de personnes qui prennent part à l’opération ou qui ont pu profiter des conseils du promoteur ou du conseiller fiscal au sujet des conséquences fiscales de l’opération.</li>
</ol>
</li>
<li>Le promoteur ou le conseiller fiscal de l’opération obtient le « droit à la confidentialité », qui vous empêche de divulguer des renseignements sur les détails ou la structure de l’opération.</li>
<li>Vous, la personne qui conclut l’opération en votre nom, le promoteur ou le conseiller fiscal se prévaut ou s’est prévalu d’une « protection contractuelle ». Il s’agit de toute forme de protection contre l’échec de l’opération ou qui donne droit au paiement de dépenses (y compris d’impôt, de pénalités, d’intérêts ou d’un montant semblable) qui peuvent être engagées en cas de différend à l’égard de l’avantage fiscal.</li>
</ol>
<h2>Qui doit divulguer des opérations à déclarer?</h2>
<p>Si vous concluez une opération à déclarer pour vous‑mêmes ou au profit d’une autre personne, vous devez la divulguer. Les promoteurs et les conseillers fiscaux sont aussi tenus de le faire.</p>
<h2>Quel est le processus pour divulguer une opération à déclarer?</h2>
<p>Que vous soyez un particulier, une société, une fiducie ou une société de personnes, vous devez remplir une déclaration de renseignements et l’envoyer à l’Agence du revenu du Canada. Vous devez produire le formulaire RC312, Déclaration de renseignements sur les opérations à déclarer, au plus tard le 30 juin suivant l’année civile au cours de laquelle l’opération est devenue pour la première fois une opération à déclarer. Ce formulaire doit être produit séparément de votre déclaration de revenus et de toute autre déclaration de renseignements.</p>
<h2>Quelles sont les conséquences si on ne déclare pas une opération?</h2>
<ul class="list-unstyled">
<li><strong>Pénalité :</strong> Si vous, ou votre représentant, ne produisez pas le formulaire RC312 dans le délai prévu, vous devrez, ainsi que chaque personne tenue de le produire, payer une pénalité, même s’il a eu entente sur qui devait le produire. Le montant de la pénalité est égal au montant total des honoraires à l’égard de l’opération que le promoteur ou le conseiller fiscal a le droit de recevoir.</li>
<li><strong>Suspension de l’avantage fiscal :</strong> En plus de la pénalité, l’avantage fiscal est refusé jusqu’à ce que l’obligation de produire le formulaire RC312 soit satisfaite et que la pénalité et les intérêts cumulés soient payés.</li>
<li><strong>Période de nouvelle cotisation prolongée :</strong> Si le formulaire RC312 n’a pas été produit dans le délai prévu, la période pendant laquelle l’ARC peut établir une nouvelle cotisation est prolongée de trois ans suivant la date où il a été produit.</li>
</ul>
<p>Pour en savoir plus, consultez le document d’information de 2013 intitulé Nouvelles exigences en matière de déclaration : opérations à déclarer ou le formulaire RC312, Déclaration de renseignements sur les opérations à déclarer.</p>
<p class="text-center">-30-</p>
<h2>Soyez branché</h2>
<p>Pour recevoir des mises à jour lorsque nous ajoutons de nouveaux renseignements à notre site Web, vous pouvez :</p>
<ul class="list-unstyled mrgn-lft-md">
<li><img alt="" src="/images/scl-md/16px/twitter.gif" height="16" /> Suivre l'ARC sur Twitter - #AgenceRevCan</li>
<li><img alt="" src="/images/scl-md/16px/email.gif" height="16" /> Vous abonner à une liste d'envois électroniques de l'ARC</li>
<li><img alt="" src="/images/scl-md/16px/rss.gif" height="16" /> Ajouter nos fils RSS à votre lecteur de nouvelles</li>
</ul>
<p><img alt="" src="/images/scl-md/16px/youtube.gif" height="16" /> Vous pouvez également visiter notre canal YouTube pour voir des vidéos sur l'impôt.</p>
<p>Renseignements aux médias</p>
<p><br />
<!-- InstanceEndEditable --></p>
<dl property="dateModified" id="wb-dtmd">
<dt>Date de modification :</dt>
<dd>
<time>2015-06-11</time>
</dd>
</dl>
</main>
Thanks!

Just like everyone is suggesting here in comments and in your last question you should use html parsers if possible. I don't have the best experience with them so I will try to update this code to comply with your needs.
The main problem you are having is that when you pass a file object to Select-String it will be read in a string array and not a single string. Both approaches have their merits but in your case this is not what you want since you need to do a multi-line match. Since line number is not important this can be simplified
param(
[string]$pattern,
[string]$path
)
Get-ChildItem -path $path -Recurse -Filter *.html |
Where-Object{
Select-String -InputObject (Get-Content $_.FullName | Out-String) $pattern -Quiet
}
}
What that will do is use Get-Content to read in the entire file as one string with the help of | Out-String then we use a slightly tweaked version of your regex. We needed to escape a backslash and add a couple of modifiers. </main> became <\/main> in the pattern below as well as adding (?sm).
(?sm)<main([\w\W]*)list-unstyled([\w\W]*)<\/main>
Since we use -Quiet with Select-String we only get a boolean result. Using that inside the Where-Object clause allow only the fileinfo object matching the criteria to pass thru the pipe. That way if you had to say.. move the files you can just tack on a Move-Item without the need of another foreach-object loop.
You have this as a script I will presume? If you want to filter this output you would need to add a pipe | Select Fullname | Export-CSV "C:\somepath". Whether you put this into the function or use it like this script.ps1 pattern path | Select Fullname | Export-CSV "C:\somepath" is up to you.

Here is a PS script that might get you closer to what you are looking for. Adjust the logic for your situation.
$regex = [regex] '(?m)<main([\w\W]*)list-unstyled([\w\W]*)</main>'
get-childitem *.htm |
foreach { $txt = type $_ ;
$props = #{
status = $regex.Match($txt).Success;
path = $_
} ;
new-object -TypeName PSCustomObject -Property $props
}
status path
------ ----
True C:\Users\Les\testfile.htm
False C:\Users\Les\testfile2.htm
False C:\Users\Les\testfile3.htm

Related

partial extraction of urls due to bad handling of accented and punctuation characters

Inside film_disponibili.txt I have these lines
La forza dell'amore
La forza della volontà
La fuga - Girl in Flight
Inside html_di_test.txt I have this html code
La forza dell’amore [B/N] (1936)
La forza della volontà [HD] (1988)
La fuga – Girl in Flight [HD] (2016)
Lo studente (1982)
I try to writes into a file called urls_estratti.txt only these urls extracted from html_di_test.txt
https://cb01.clinic/la-forza-dellamore-b-n-1936/
https://cb01.clinic/la-forza-della-volonta-hd-1988/
https://cb01.clinic/la-fuga-girl-in-flight-hd-2016/
but I get only this url
https://cb01.clinic/la-forza-della-volonta-hd-1988/
these urls are missing and I don't understand why
https://cb01.clinic/la-forza-dellamore-b-n-1936/
https://cb01.clinic/la-fuga-girl-in-flight-hd-2016/
This is the code that I'm trying to set
$films = Get-Content .\film_disponibili.txt
$html = Get-Content .\html_di_test.txt -Raw
$urls = foreach ($film in $films) {
$film_decoded = [System.Web.HttpUtility]::HtmlDecode($film)
$regex = '.*<a href="(https://cb01.clinic/.*)">' + [regex]::Escape($film_decoded) + '.*'
$match = [regex]::Match($html, $regex)
if ($match.Success) { $match.Groups[1].Value }
}
$urls | Set-Content .\urls_estratti.txt
Condition is this: if there is a string like La fuga - Girl in Flight into
La fuga – Girl in Flight [HD] (2016) `
script should be write this url: https://cb01.clinic/la-fuga-girl-in-flight-hd-2016/
But this doesn't totally happen, I saw that there is a problem with the accented characters, the apostrophe and the dash in the middle of the name, but I can't handle them completely
As stated in comments ’ is a smart quote and – is a en dash which don't match ' or - respectively hence your problem.
You could change your film_disponibili.txt file to the following:
La forza dell\p{P}amore
La forza della volontà
La fuga \p{P} Girl in Flight
Using \p{P} you can match any kind of punctuation character.
Then another take on solving this problem is using Htmlfile to parse html_di_test.txt.
Code would look as follows:
$toMatch = Get-Content .\film_disponibili.txt
$content = Get-Content .\html_di_test.txt -Raw
$html = New-Object -ComObject htmlfile
$html.write([System.Text.Encoding]::Unicode.GetBytes($content))
$predicate = [Func[object, bool]]{ $_.textContent -match $args[0] }
$html.getElementsByTagName('a') |
Where-Object { [Linq.Enumerable]::Any($toMatch, $predicate) } |
ForEach-Object href
And output would be:
https://cb01.clinic/la-forza-dellamore-b-n-1936/
https://cb01.clinic/la-forza-della-volonta-hd-1988/
https://cb01.clinic/la-fuga-girl-in-flight-hd-2016/

Counting number of letters in a text

I have defined a function that counts the number of letters in a text incasesensitive. The problem is that a letter that is not in the text equals the previous letter in the alphabet. In this case there is no x or w in the text but on the print it is equal to v which is 176. Any suggestion why?
trontalen = "Ærede President, Folkets representanter. Jeg hilser Stortinget velkommen til ansvarsfullt arbeid og ønsker at det må bli til gagn for fedrelandet. Etter halvannet år har koronaviruset løsnet sitt grep om vår hverdag. Norge har klart seg bedre gjennom pandemien enn de fleste andre land. Tiltakene har vært byrdefulle for mange. Men færre har mistet livet og flere har vært i jobb sammenlignet med andre land. Raske og effektive tiltak har begrenset spredningen av viruset. God etterlevelse og oppslutning om tiltakene har vært nødvendig. Samarbeidet med EU om anskaffelse av vaksiner har gitt oss en vei ut av pandemien. Regjeringen har etablert beredskapslagre for smittevernutstyr og medisiner. Arbeid er satt i gang for å øke intensivkapasiteten. Regjeringen vil opprettholde en høy beredskap for nye virusvarianter. Regjeringen vil i den kommende perioden særlig prioritere to store utfordringer for Norge: Begrense utslippene av klimagasser og inkludere flere i arbeidslivet. Farlige klimaendringer er vår tids største utfordring. Norge skal redusere egne utslipp av klimagasser i tråd med våre internasjonale forpliktelser. I tillegg skal vi støtte fattige land i deres arbeid. Norske utslipp går ned. I forrige periode la regjeringen frem planen for ytterligere utslippskutt frem mot 2030. Nå skal denne planen iverksettes. Det viktigste tiltaket er at prisen for å slippe ut klimagasser må gå opp. Det er nødvendig for å skape et marked for nye, klimavennlige løsninger og ny teknologi. Regjeringen vil derfor fremme forslag om økt pris på utslipp av gasser som bidrar til klimaendringene. Øvrige skatter og avgifter skal senkes, slik at samlet skattenivå ikke øker. Regjeringen vil også fremme forslag om et nytt og mer nøytralt skattesystem for petroleumssektoren. Regjeringen vil følge opp veikartet for hydrogen og fortsette byggingen av anlegg for fangst og lagring av CO2. Og så snart som mulig skal selskaper kunne søke konsesjon for utbygging av havvind i åpnede områder. God sameksistens med eksisterende næringer skal ivaretas. Regjeringen vil legge til rette for videre elektrifisering av og fortsatt sikker tilgang på strøm for norsk industri og transport. Regjeringen vil styrke Grønn plattform som støtter opp om økt verdiskaping innenfor bærekraftige rammer. Et nytt fond som skal investere i fornybar energi i utviklingsland, skal bygges opp over fem år. Den andre store utfordringen er å inkludere flere i arbeidslivet. Den økonomiske aktiviteten i Norge tar seg raskt opp. Det er nå flere sysselsatte i befolkningen enn før pandemien kom. Stadig færre går ledige. Det blir stadig flere ledige stillinger. Perspektivmeldingen viser at vi trenger flere lønnsomme jobber og flere i arbeid for å finansiere velferden når bidraget fra oljeaktiviteten reduseres. Allerede nå ser vi mangel på kvalifisert arbeidskraft flere steder. Det er både en utfordring og en mulighet. En utfordring fordi mangel på arbeidskraft gir mindre verdiskaping og velferd i samfunnet. En mulighet fordi det er mange flere som kan og vil arbeide i vårt samfunn. Den muligheten vil regjeringen gripe. Regjeringen vil gjennomføre fullføringsreformen slik at flere blir kvalifisert for arbeidslivet og videre studier. Utdanningsløftet skal fortsette. Regjeringen vil følge opp strategien for desentralisert og fleksibel utdanning ved fagskoler, høyskoler og universiteter for å styrke tilgangen på kompetanse både i byene og distriktene. Muligheten for stedsuavhengige arbeidsplasser gjør det mulig å jobbe fra der man måtte ønske. Arbeidet for inkludering i arbeidslivet må styrkes ytterligere. Den nye NAV-strategien skal gi økt innovasjon og bedre tjenester på arbeids- og velferdsfeltet. Regjeringen vil gjøre det enklere å ta utdanning samtidig som man mottar offentlige ytelser til livsopphold. Kompetansereformen skal bidra til at ingen som er i jobb, går ut på dato i vårt arbeidsliv. Flere i arbeid er den viktigste forutsetningen for et samfunn med mindre fattigdom og små forskjeller. Pandemien har vist at godt internasjonalt samarbeid er god beredskap. Norge har vært avhengig av EU for effektiv tilgang til vaksiner. EØS-avtalen bidro til å lette importen av smittevernutstyr. Norge har også hjulpet andre land som har vært mer alvorlig rammet enn oss. Pandemien har rammet mange fattige land hardt. Regjeringen vil fortsette arbeidet for likeverdig tilgang til covid-19-vaksiner, diagnostikk og tester globalt. Norge skal fortsatt være en pådriver for at FNs bærekraftsmål skal nås. Både i Norge og internasjonalt. Regjeringen vil gjennom medlemskapet i FNs sikkerhetsråd arbeide for et sterkt og velfungerende internasjonalt samarbeid for å ivareta global sikkerhet og fred. Regjeringen vil basere sin politikk på sterk støtte til EØS-avtalen og NATO-medlemskapet. Et godt nordisk samarbeid bygger opp om dette. Disse avtalene representerer et verdifellesskap Norge deler med våre nærmeste samarbeidspartnere. De er en forutsetning for norske arbeidsplasser og vår nasjonale sikkerhet. Og de er en avgjørende del av Norges beredskap mot kriser. Regjeringen vil videreføre arbeidet for å skape et bærekraftig velferdssamfunn. Endringer i skattesystemet skal gjøre det mer lønnsomt å jobbe og mer lønnsomt å investere i norske arbeidsplasser. Regjeringen vil fortsette den historiske satsingen på samferdsel. Regjeringen vil følge opp den nye nasjonale strategien for sosial boligpolitikk. Stadig færre er bostedsløse i Norge og den positive utviklingen må fortsette. Bostøtten skal styrkes, og regjeringen vil prioritere midler til boliglån i distriktene. Regjeringen vil styrke kompetansen i barnevernet for å forbedre tjenesten og forberede kommunene på økt ansvar. Det vil bli tatt initiativ til å oppheve aktivitetskravet tilsvarende fedrekvoten, slik at alle fedre med opptjente foreldrepengerettigheter kan ta ut fedrekvoten. Regjeringen vil utvide tilbudet om helsekartlegging for barn i barnevernet som skal flyttes ut av hjemmet. Målet er å identifisere barn som trenger hjelp på et tidligere tidspunkt. Regjeringen vil utvide fritidskortet for å senke den økonomiske terskelen for at barn kan delta i fritidsaktiviteter. Tilbudet til barn og unge med psykiske helseutfordringer skal styrkes videre, og det skal utdannes flere fagfolk til tjenestene. Regjeringen vil sette ned et partssammensatt utvalg for å styrke heltidskultur i helsetjenesten. Regjeringen vil ta initiativ til en pilot med investeringstilskudd til trygghetsboliger for eldre i distriktene. Målet er at flere eldre som selv ønsker det, skal kunne bo i eget hjem. Regjeringen vil fortsette arbeidet med å reformere og effektivisere offentlig sektor. Med lavere vekst i Statens pensjonsfond utland og en aldrende befolkning, vil handlingsrommet på budsjettene etter hvert bli klart mindre enn vi har vært vant til. Regjeringen vil fase ut den ekstraordinære bruken av oljepenger knyttet til koronapandemien. Mer effektiv bruk av fellesskapets ressurser vil bidra til at vi fortsatt kan løse utfordringer vårt samfunn stilles overfor. Digitalisering, forenkling og modernisering kan frigjøre store ressurser til velferd. Regjeringen vil videreføre og forsterke dette arbeidet. Stortingsvalget ga en ny politisk sammensetning av Stortinget. Den parlamentariske situasjonen vil kunne endre grunnlaget for det videre arbeidet med flere av de bebudede sakene. Jeg ber Gud velsigne Stortingets arbeid, og erklærer Norges 166. storting for åpnet."
bokstaver = "abcdefghijklmnopqrstuvwxyzæøå"
liste={}
def antall_bokstaver():
for j in bokstaver:
for k in trontalen:
if j==k:
antall1=trontalen.count(k)
if j.upper()==k:
antall2=trontalen.count(k)
antall=antall1+antall2
liste[j]=antall
antall_bokstaver()
print(liste)
Out:
a:346,b:100,c:2,d:251,e:971,f:180,g:308,h:52,i:464,j:66,k:193,l:308,m:159,n:473,o:286,p:115,q:115,r:604,s:383,t:514,u:86,v:176,w:176,x:176,y:39,z:39,æ:19,ø:48,å:76
This is resolved by simply adding an if statement to check if the letter is even in the string before counting.
So:
trontalen = "Ærede President, Folkets representanter. Jeg hilser Stortinget velkommen til ansvarsfullt arbeid og ønsker at det må bli til gagn for fedrelandet. Etter halvannet år har koronaviruset løsnet sitt grep om vår hverdag. Norge har klart seg bedre gjennom pandemien enn de fleste andre land. Tiltakene har vært byrdefulle for mange. Men færre har mistet livet og flere har vært i jobb sammenlignet med andre land. Raske og effektive tiltak har begrenset spredningen av viruset. God etterlevelse og oppslutning om tiltakene har vært nødvendig. Samarbeidet med EU om anskaffelse av vaksiner har gitt oss en vei ut av pandemien. Regjeringen har etablert beredskapslagre for smittevernutstyr og medisiner. Arbeid er satt i gang for å øke intensivkapasiteten. Regjeringen vil opprettholde en høy beredskap for nye virusvarianter. Regjeringen vil i den kommende perioden særlig prioritere to store utfordringer for Norge: Begrense utslippene av klimagasser og inkludere flere i arbeidslivet. Farlige klimaendringer er vår tids største utfordring. Norge skal redusere egne utslipp av klimagasser i tråd med våre internasjonale forpliktelser. I tillegg skal vi støtte fattige land i deres arbeid. Norske utslipp går ned. I forrige periode la regjeringen frem planen for ytterligere utslippskutt frem mot 2030. Nå skal denne planen iverksettes. Det viktigste tiltaket er at prisen for å slippe ut klimagasser må gå opp. Det er nødvendig for å skape et marked for nye, klimavennlige løsninger og ny teknologi. Regjeringen vil derfor fremme forslag om økt pris på utslipp av gasser som bidrar til klimaendringene. Øvrige skatter og avgifter skal senkes, slik at samlet skattenivå ikke øker. Regjeringen vil også fremme forslag om et nytt og mer nøytralt skattesystem for petroleumssektoren. Regjeringen vil følge opp veikartet for hydrogen og fortsette byggingen av anlegg for fangst og lagring av CO2. Og så snart som mulig skal selskaper kunne søke konsesjon for utbygging av havvind i åpnede områder. God sameksistens med eksisterende næringer skal ivaretas. Regjeringen vil legge til rette for videre elektrifisering av og fortsatt sikker tilgang på strøm for norsk industri og transport. Regjeringen vil styrke Grønn plattform som støtter opp om økt verdiskaping innenfor bærekraftige rammer. Et nytt fond som skal investere i fornybar energi i utviklingsland, skal bygges opp over fem år. Den andre store utfordringen er å inkludere flere i arbeidslivet. Den økonomiske aktiviteten i Norge tar seg raskt opp. Det er nå flere sysselsatte i befolkningen enn før pandemien kom. Stadig færre går ledige. Det blir stadig flere ledige stillinger. Perspektivmeldingen viser at vi trenger flere lønnsomme jobber og flere i arbeid for å finansiere velferden når bidraget fra oljeaktiviteten reduseres. Allerede nå ser vi mangel på kvalifisert arbeidskraft flere steder. Det er både en utfordring og en mulighet. En utfordring fordi mangel på arbeidskraft gir mindre verdiskaping og velferd i samfunnet. En mulighet fordi det er mange flere som kan og vil arbeide i vårt samfunn. Den muligheten vil regjeringen gripe. Regjeringen vil gjennomføre fullføringsreformen slik at flere blir kvalifisert for arbeidslivet og videre studier. Utdanningsløftet skal fortsette. Regjeringen vil følge opp strategien for desentralisert og fleksibel utdanning ved fagskoler, høyskoler og universiteter for å styrke tilgangen på kompetanse både i byene og distriktene. Muligheten for stedsuavhengige arbeidsplasser gjør det mulig å jobbe fra der man måtte ønske. Arbeidet for inkludering i arbeidslivet må styrkes ytterligere. Den nye NAV-strategien skal gi økt innovasjon og bedre tjenester på arbeids- og velferdsfeltet. Regjeringen vil gjøre det enklere å ta utdanning samtidig som man mottar offentlige ytelser til livsopphold. Kompetansereformen skal bidra til at ingen som er i jobb, går ut på dato i vårt arbeidsliv. Flere i arbeid er den viktigste forutsetningen for et samfunn med mindre fattigdom og små forskjeller. Pandemien har vist at godt internasjonalt samarbeid er god beredskap. Norge har vært avhengig av EU for effektiv tilgang til vaksiner. EØS-avtalen bidro til å lette importen av smittevernutstyr. Norge har også hjulpet andre land som har vært mer alvorlig rammet enn oss. Pandemien har rammet mange fattige land hardt. Regjeringen vil fortsette arbeidet for likeverdig tilgang til covid-19-vaksiner, diagnostikk og tester globalt. Norge skal fortsatt være en pådriver for at FNs bærekraftsmål skal nås. Både i Norge og internasjonalt. Regjeringen vil gjennom medlemskapet i FNs sikkerhetsråd arbeide for et sterkt og velfungerende internasjonalt samarbeid for å ivareta global sikkerhet og fred. Regjeringen vil basere sin politikk på sterk støtte til EØS-avtalen og NATO-medlemskapet. Et godt nordisk samarbeid bygger opp om dette. Disse avtalene representerer et verdifellesskap Norge deler med våre nærmeste samarbeidspartnere. De er en forutsetning for norske arbeidsplasser og vår nasjonale sikkerhet. Og de er en avgjørende del av Norges beredskap mot kriser. Regjeringen vil videreføre arbeidet for å skape et bærekraftig velferdssamfunn. Endringer i skattesystemet skal gjøre det mer lønnsomt å jobbe og mer lønnsomt å investere i norske arbeidsplasser. Regjeringen vil fortsette den historiske satsingen på samferdsel. Regjeringen vil følge opp den nye nasjonale strategien for sosial boligpolitikk. Stadig færre er bostedsløse i Norge og den positive utviklingen må fortsette. Bostøtten skal styrkes, og regjeringen vil prioritere midler til boliglån i distriktene. Regjeringen vil styrke kompetansen i barnevernet for å forbedre tjenesten og forberede kommunene på økt ansvar. Det vil bli tatt initiativ til å oppheve aktivitetskravet tilsvarende fedrekvoten, slik at alle fedre med opptjente foreldrepengerettigheter kan ta ut fedrekvoten. Regjeringen vil utvide tilbudet om helsekartlegging for barn i barnevernet som skal flyttes ut av hjemmet. Målet er å identifisere barn som trenger hjelp på et tidligere tidspunkt. Regjeringen vil utvide fritidskortet for å senke den økonomiske terskelen for at barn kan delta i fritidsaktiviteter. Tilbudet til barn og unge med psykiske helseutfordringer skal styrkes videre, og det skal utdannes flere fagfolk til tjenestene. Regjeringen vil sette ned et partssammensatt utvalg for å styrke heltidskultur i helsetjenesten. Regjeringen vil ta initiativ til en pilot med investeringstilskudd til trygghetsboliger for eldre i distriktene. Målet er at flere eldre som selv ønsker det, skal kunne bo i eget hjem. Regjeringen vil fortsette arbeidet med å reformere og effektivisere offentlig sektor. Med lavere vekst i Statens pensjonsfond utland og en aldrende befolkning, vil handlingsrommet på budsjettene etter hvert bli klart mindre enn vi har vært vant til. Regjeringen vil fase ut den ekstraordinære bruken av oljepenger knyttet til koronapandemien. Mer effektiv bruk av fellesskapets ressurser vil bidra til at vi fortsatt kan løse utfordringer vårt samfunn stilles overfor. Digitalisering, forenkling og modernisering kan frigjøre store ressurser til velferd. Regjeringen vil videreføre og forsterke dette arbeidet. Stortingsvalget ga en ny politisk sammensetning av Stortinget. Den parlamentariske situasjonen vil kunne endre grunnlaget for det videre arbeidet med flere av de bebudede sakene. Jeg ber Gud velsigne Stortingets arbeid, og erklærer Norges 166. storting for åpnet."
bokstaver = "abcdefghijklmnopqrstuvwxyzæøå"
liste={}
def antall_bokstaver():
for j in bokstaver:
if j in trontalen:
for k in trontalen:
if j==k:
antall1=trontalen.count(k)
if j.upper()==k:
antall2=trontalen.count(k)
antall=antall1+antall2
liste[j]=antall
antall_bokstaver()
print(liste)

Is there a way to join lines after a match expression in awk?

I'm trying to format in a better way a text. I want to join conditionally two subsequent line in awk: if the line end in "." print the line as it is, if the line doesn't end in "." join this and the subsequent line if the latter begin in lowercase.
i have tried this calling awk -f scriptfile textfile
{ if ( $NF ~ /.*\./ )
print $0;
else {
line_p=$0;
getline;
if ( $0 ~ /^[ a-z]+/ )
print line_p, $0;
else {
print line_p;
print $0
}
}
}
I've tried on this:
io sono un segno
cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli
opere incompiute
but the output is this:
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli
opere incompiute opere incompiute
i don't understand the last repetition and why line 6 and 7 are not joined together
expected:
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli opere incompiute
$ awk '{printf "%s%s", (/^[[:lower:]]/ && (p !~ /\.$/) ? ofs : ors), $0; ofs=OFS; ors=ORS} {p=$0} END{print ""}' file
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli opere incompiute
You can set the output record separator to an empty string and set a flag based on whether the current line ends with a ., so that when you processing the next line you can manually output either a space or a newline based on the flag and whether the current line starts with a lowercase letter before printing the current line:
awk 'BEGIN{ORS=""}{if(/\.$/){print" ";a=2}else{if(a==2||/^[^a-z]/){print "\n"}else{if(a)print" "};a=1}}END{print"\n"}1' textfile
This outputs:
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli opere incompiute

Delete strings from an array when this string match with a part of a sentence - Perl

I'm matching multiple patterns in a string to populate an array. The input file looks like this:
I love cat [chats;chaton;chatterie] and rabbit [lapins;lapereau] # J'aime les chats et les lapins # 2.8
My father [père;parent;papa] lives in New-York # Mon père vit à New-York # 1.8
I use this code:
use strict;
use warnings;
use Data::Dump;
open(TEXT, "<", "$ARGV[0]")
or die "cannot open < $ARGV[0]: $!";
while(my $text = <TEXT>)
{
my #lines = split /\n/, $text;
foreach my $line (#lines) {
if ($line =~ /(^(.+)\t(.+)\t(.+)$)/){
my $english_sentence = $2;
my $french_sentence = $3;
my $score = $4;
print $english_sentence."#".$french_sentence."";
my #data = map [ split /;/ ], $line =~ / \[ ( [^\[\]]+ ) \] /xg;
dd \#data;
}
print "\n";
}
}
close TEXT;
Here is the output:
I love cat [chats;chaton;chatterie] and rabbit [lapins;lapereau] # J'aime les chats et les lapins
Array==>[["chats", "chaton", "chatterie"], ["lapins", "lapereau"]]
My father [père;parent;papa] lives in New-York # Mon père vit à New-York
Array==>[["père", "parent", "papa"]]
I need to delete the strings in the array when this string match with a part of the sentence. Finally, I'd like to have this results:
I love cat [chats;chaton;chatterie] and rabbit [lapins;lapereau] # J'aime les chats et les lapins
[["chats"], ["lapins"]]
My father [père;parent;papa] lives in New-York # Mon père vit à New-York
[["père"]]
This will do as you ask. It just uses grep with a regex to reduce each list to only those words that appear in the French sentence.
use utf8;
use strict;
use warnings;
use 5.010;
use autodie;
use open qw/ :std :encoding(UTF-8) /;
use Data::Dump;
open my $fh, '<', 'sentences.txt';
while (<$fh>) {
my #sentences = split /\s*#\s*/;
next unless #sentences == 3;
print join(' # ', #sentences[0,1]), "\n";
my #data = map [ split /;/ ], $sentences[0] =~ / \[ ( [^\[\]]+ ) \] /xg;
$_ = [ grep { $sentences[1] =~ /\b\Q$_\E\b/ } #$_ ] for #data;
dd \#data;
print "\n";
}
output
I love cat [chats;chaton;chatterie] and rabbit [lapins;lapereau] # J'aime les chats et les lapins
[["chats"], ["lapins"]]
My father [père;parent;papa] lives in New-York # Mon père vit à New-York
[["p\xE8re"]]
Update
As requested, this code will modify the word lists in-place so that they contain only words that appear in the translation.
use utf8;
use strict;
use warnings;
use 5.010;
use autodie;
use open qw/ :std :utf8 /;
open my $fh, '<', 'sentences.txt';
while (<$fh>) {
my #sentences = split /\s*#\s*/;
next unless #sentences == 3;
print join(' # ', #sentences[0,1]), "\n";
$sentences[0] =~ s{ \[ ( [^\[\]]+ ) \] }{
my #words = split /;/, $1;
#words = grep { $sentences[1] =~ /\b\Q$_\E\b/ } #words;
sprintf "[%s]", join ';', #words;
}exg;
print join(' # ', #sentences[0,1]), "\n\n";
}
output
I love cat [chats;chaton;chatterie] and rabbit [lapins;lapereau] # J'aime les chats et les lapins
I love cat [chats] and rabbit [lapins] # J'aime les chats et les lapins
My father [père;parent;papa] lives in New-York # Mon père vit à New-York
My father [père] lives in New-York # Mon père vit à New-York
You can also do this by creating a hash of the French sentence's words.
This might be quicker since it avoids a third regex.
use strict;
use warnings;
while (<DATA>) {
my ($English, $French, $repl, %FrWords);
if ( ($English, $French) = m/^([^#]*)\#([^#]*)\#/ ) {
#FrWords{ split /\h+/, $French } = undef;
$English =~ s{ \[ ([^\[\]]*) \] }{
$repl = join( ';', grep { exists $FrWords{$_} } split /;/, $1 );
'['. (length($repl) ? $repl : '') .']';
}xeg;
print $English, '#', $French, "\n";
}
}
__DATA__
I love cat [chats;chaton;chatterie] and rabbit [lapins;lapereau] # J'aime les chats et les lapins # 2.8
My father [père;parent;papa] lives in New-York # Mon père vit à New-York # 1.8
Output
I love cat [chats] and rabbit [lapins] # J'aime les chats et les lapins
My father [père] lives in New-York # Mon père vit à New-York

Print FILENAME if 1 conditional (out of 2 options) is found outside 'square brackets'

I was wondering how to print filename base on finding one pattern (out of two options) outside square braquets in several files.
This is to say:
Look for two patterns (patterns are words repeated into several files) and iff both are at the same line of a file, print FILENAME.
These two words are outside square brackets.
These two words are located through its NF. 1st word is in $(NF?NF-2:"") or $(NF?NF-1:""). 2nd word is in $NF.
Based on:
-F,
word1=Villa de Leyva
word2=Colombia
/^C1 /
($(NF?NF-2:"")==/Villa de Leyva/ && $NF==/Colombia/ ) || ($(NF?NF-1:"")==/Villa de Leyva/ && $NF==/Colombia/ ) IFF At the same NR
Input
File 1 with name: xx1
PT J
C1 [Ramirez, P.A.; Villa de Leyva, A.; Smith, W.] University Villa de Leyva, Villa de Leyva, Colombia
C1 [Antunez, P.; Howard, R.; Li, X.] University X, Villa de Leyva, Caldas, Ecuador
[Trujillo, A.; Santos, K.; Wassermann, J.] Instituto Y, Villa de Leyva, Sweden
PY 9999
File 2 with name: xx100
PT J
C1 [Ramirez, P.A.; Villa de Leyva, A.; Smith, W.] University Villa de Leyva, Villa de Leyva, Chile
C1 [Antunez, P.; Howard, R.; Li, X.] University X, Villa de Leyva, Caldas, Colombia
C1 [Trujillo, A.; Santos, K.; Wassermann, J.] Instituto Y, Villa de Leyva, Sweden
PY 9999
File 3 with name: xx333
PT J
C1 [Ramirez, P.A.; Villa de Leyva, A.; Smith, W.] University Villa de Leyva, Villa de Leyva, Chile
C1 [Antunez, P.; Howard, R.; Li, X.] University X, Villa de Leyva, Caldas, Mozambique
[Trujillo, A.; Santos, K.; Wassermann, J.] Instituto Y, Villa de Leyva, Sweden
PY 9999
Expected Output
xx1
xx100
$ awk -F, 'NF>2 && $NF~/Colombia/ && ($(NF-2)~/Villa de Leyva/ || $(NF-1)~/Villa de Leyva/) {print FILENAME}' *
xx1
xx100
Explanation
The above works by combining four conditions. If the conditions are met, then the file name is printed.
The first required condition is:
NF>2
This requires that the line have at least three fields.
The second required condition is:
$NF~/Colombia/
This requires that the last field contain Columbia.
And, finally, one of the following two conditions must be met:
$(NF-2)~/Villa de Leyva/
$(NF-1)~/Villa de Leyva/
Together, these require that Villa de Leyva appear in either the second to last or third to last fields.
Passing in search parameters from the shell
Here, the names to search for as passed in to awk as variables, var1 and var2, on the command line:
$ awk -F, -v var2="Villa de Leyva" -v var1="Colombia" 'NF>2 && $NF~var1 && ($(NF-2)~var2 || $(NF-1)~var2) {print FILENAME}' xx*
xx1
xx100
To check if the pattern exists in a single file you could use this:
cat /tmp/b | perl -pe 's/\[.*?\]//g' | grep -P "Villa de Leyva,[^,]*,* Colombia"
This will return the line that matches your criteria.
If you want to look through multiple files loop through with a for:
for i in $( ls file1 file2 ...);
> do
> if cat $i | perl -pe 's/\[.*?\]//g' | grep -q -P "Villa de Leyva,[^,]*,* Colombia"
> then
> echo $i
> fi
> done
Oneliner:
for i in $( ls *); do if cat $i | perl -pe 's/\[.*?\]//g' | grep -q -P "Villa de Leyva,[^,]*,* Colombia"; then echo $i; fi; done
Grep should suffice, the -l option prints only the file name, and the pattern you looking for should not span lines if you anchor it with ^ and $ like:
grep -l '^.*Villa de Leyva.*Colombia.*$' xx*
Output:
xx1
xx100