Copy specific portion of lines from a text file to separate file using powershell
I have one file in which i want to search a text and then i need to find start and end block. Then need to copy to another file. I have multiple statements in the same file.
below is an example.
1: Start
2: hello
3: Hello world
4: Good Morning
5: End
I want to search "Good Morning" and then i want to copy text between start and end block to new file.
powershell
add a comment |
I have one file in which i want to search a text and then i need to find start and end block. Then need to copy to another file. I have multiple statements in the same file.
below is an example.
1: Start
2: hello
3: Hello world
4: Good Morning
5: End
I want to search "Good Morning" and then i want to copy text between start and end block to new file.
powershell
What have you tried so far? Also do you want the numbers included in your search or no?
– SysEngineer
Nov 12 '18 at 19:07
1
IF - and that is a big IF - your text is formatted as shown all the time, then take a look at the-Context
parameter ofSelect-String
. that accepts one or two [int]s for "lines before, lines after". so-Context 3,1
will grab the 3 lines before the matching line AND the 1 line after it. [grin] ///// take a look atGet-Help Select-String -Parameter Context
for more info.
– Lee_Dailey
Nov 12 '18 at 19:52
add a comment |
I have one file in which i want to search a text and then i need to find start and end block. Then need to copy to another file. I have multiple statements in the same file.
below is an example.
1: Start
2: hello
3: Hello world
4: Good Morning
5: End
I want to search "Good Morning" and then i want to copy text between start and end block to new file.
powershell
I have one file in which i want to search a text and then i need to find start and end block. Then need to copy to another file. I have multiple statements in the same file.
below is an example.
1: Start
2: hello
3: Hello world
4: Good Morning
5: End
I want to search "Good Morning" and then i want to copy text between start and end block to new file.
powershell
powershell
edited Nov 12 '18 at 22:28
asked Nov 12 '18 at 19:03
Saurabh
93
93
What have you tried so far? Also do you want the numbers included in your search or no?
– SysEngineer
Nov 12 '18 at 19:07
1
IF - and that is a big IF - your text is formatted as shown all the time, then take a look at the-Context
parameter ofSelect-String
. that accepts one or two [int]s for "lines before, lines after". so-Context 3,1
will grab the 3 lines before the matching line AND the 1 line after it. [grin] ///// take a look atGet-Help Select-String -Parameter Context
for more info.
– Lee_Dailey
Nov 12 '18 at 19:52
add a comment |
What have you tried so far? Also do you want the numbers included in your search or no?
– SysEngineer
Nov 12 '18 at 19:07
1
IF - and that is a big IF - your text is formatted as shown all the time, then take a look at the-Context
parameter ofSelect-String
. that accepts one or two [int]s for "lines before, lines after". so-Context 3,1
will grab the 3 lines before the matching line AND the 1 line after it. [grin] ///// take a look atGet-Help Select-String -Parameter Context
for more info.
– Lee_Dailey
Nov 12 '18 at 19:52
What have you tried so far? Also do you want the numbers included in your search or no?
– SysEngineer
Nov 12 '18 at 19:07
What have you tried so far? Also do you want the numbers included in your search or no?
– SysEngineer
Nov 12 '18 at 19:07
1
1
IF - and that is a big IF - your text is formatted as shown all the time, then take a look at the
-Context
parameter of Select-String
. that accepts one or two [int]s for "lines before, lines after". so -Context 3,1
will grab the 3 lines before the matching line AND the 1 line after it. [grin] ///// take a look at Get-Help Select-String -Parameter Context
for more info.– Lee_Dailey
Nov 12 '18 at 19:52
IF - and that is a big IF - your text is formatted as shown all the time, then take a look at the
-Context
parameter of Select-String
. that accepts one or two [int]s for "lines before, lines after". so -Context 3,1
will grab the 3 lines before the matching line AND the 1 line after it. [grin] ///// take a look at Get-Help Select-String -Parameter Context
for more info.– Lee_Dailey
Nov 12 '18 at 19:52
add a comment |
2 Answers
2
active
oldest
votes
With a regular expression with lookarounds you can find the match
(see the regex live with different escaping =` )
With your text in a file .sample.txt
, this snippet:
#requires -Version 3.0
[regex]::match((Get-Content .Sample.txt -raw),"(?sm)(?<=^Start`r?`n).*?Good Morning.*?(?=`r?`nEnd)").Value
# lookbehind / lookahead/
returns
hello
Hello world
Good Morning
add a comment |
The following will get you what you want. First I grabbed the contents of the txt file and put it in the $doc
variable.
Then using powershell's native "text" search feature I look for the string containing "Good Morning" and if that is true then using regex I grab all contents between the start and end text and create a new txt file with those contents. Below is the code.
$doc = Get-Content C:Scriptstest.txt
if(Select-String -InputObject $doc -Pattern "Good Morning" -SimpleMatch){
$contents = [regex]::Match($doc,'(?is)(?<=bd: Startb).*?(?=bd: Endb)')
New-Item -Path C:Scripts -Name newtest.txt -ItemType File -Value $contents
}
Else{
Write-Host "Nothing Found"
}
I tried below code. it generates output file but its blank. can we add like command instead of is start end? $doc = Get-Content "C:Usersa154499DesktoptestPS.txt" if(Select-String -InputObject $doc -Pattern "dwsn14626" -SimpleMatch){ $contents = [regex]::Match($doc,'(?is)(?<=bd: Scheduleb).*?(?=bd: Endb)') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 20:35
It is not working for me. i have many recursive entries in the file. will this script help to show multiple section in file?
– Saurabh
Nov 12 '18 at 20:58
It worked if i have only one occurrence but not working in my case because i have multiple occurrence of schedule and end statements. $doc = Get-Content "C:testPS.txt" if(Select-String -InputObject $doc -Pattern "DWSN14624"){ $contents = [regex]::Match($doc,'(?sm)(?=SCHEDULE).*?DWSN14624.*?(?=END).*') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 22:30
Separating the triggerGood Morning
from theStart
,End
markers could lead to false positives in a more complex scenario than originally given. @Saurabh Did I guess right the leadinng numbers colon are not part of the file? You should append a more real life example to your question.
– LotPings
Nov 13 '18 at 6:35
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53268522%2fcopy-specific-portion-of-lines-from-a-text-file-to-separate-file-using-powershel%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
With a regular expression with lookarounds you can find the match
(see the regex live with different escaping =` )
With your text in a file .sample.txt
, this snippet:
#requires -Version 3.0
[regex]::match((Get-Content .Sample.txt -raw),"(?sm)(?<=^Start`r?`n).*?Good Morning.*?(?=`r?`nEnd)").Value
# lookbehind / lookahead/
returns
hello
Hello world
Good Morning
add a comment |
With a regular expression with lookarounds you can find the match
(see the regex live with different escaping =` )
With your text in a file .sample.txt
, this snippet:
#requires -Version 3.0
[regex]::match((Get-Content .Sample.txt -raw),"(?sm)(?<=^Start`r?`n).*?Good Morning.*?(?=`r?`nEnd)").Value
# lookbehind / lookahead/
returns
hello
Hello world
Good Morning
add a comment |
With a regular expression with lookarounds you can find the match
(see the regex live with different escaping =` )
With your text in a file .sample.txt
, this snippet:
#requires -Version 3.0
[regex]::match((Get-Content .Sample.txt -raw),"(?sm)(?<=^Start`r?`n).*?Good Morning.*?(?=`r?`nEnd)").Value
# lookbehind / lookahead/
returns
hello
Hello world
Good Morning
With a regular expression with lookarounds you can find the match
(see the regex live with different escaping =` )
With your text in a file .sample.txt
, this snippet:
#requires -Version 3.0
[regex]::match((Get-Content .Sample.txt -raw),"(?sm)(?<=^Start`r?`n).*?Good Morning.*?(?=`r?`nEnd)").Value
# lookbehind / lookahead/
returns
hello
Hello world
Good Morning
edited Nov 12 '18 at 20:07
answered Nov 12 '18 at 19:50
LotPings
17.9k61532
17.9k61532
add a comment |
add a comment |
The following will get you what you want. First I grabbed the contents of the txt file and put it in the $doc
variable.
Then using powershell's native "text" search feature I look for the string containing "Good Morning" and if that is true then using regex I grab all contents between the start and end text and create a new txt file with those contents. Below is the code.
$doc = Get-Content C:Scriptstest.txt
if(Select-String -InputObject $doc -Pattern "Good Morning" -SimpleMatch){
$contents = [regex]::Match($doc,'(?is)(?<=bd: Startb).*?(?=bd: Endb)')
New-Item -Path C:Scripts -Name newtest.txt -ItemType File -Value $contents
}
Else{
Write-Host "Nothing Found"
}
I tried below code. it generates output file but its blank. can we add like command instead of is start end? $doc = Get-Content "C:Usersa154499DesktoptestPS.txt" if(Select-String -InputObject $doc -Pattern "dwsn14626" -SimpleMatch){ $contents = [regex]::Match($doc,'(?is)(?<=bd: Scheduleb).*?(?=bd: Endb)') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 20:35
It is not working for me. i have many recursive entries in the file. will this script help to show multiple section in file?
– Saurabh
Nov 12 '18 at 20:58
It worked if i have only one occurrence but not working in my case because i have multiple occurrence of schedule and end statements. $doc = Get-Content "C:testPS.txt" if(Select-String -InputObject $doc -Pattern "DWSN14624"){ $contents = [regex]::Match($doc,'(?sm)(?=SCHEDULE).*?DWSN14624.*?(?=END).*') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 22:30
Separating the triggerGood Morning
from theStart
,End
markers could lead to false positives in a more complex scenario than originally given. @Saurabh Did I guess right the leadinng numbers colon are not part of the file? You should append a more real life example to your question.
– LotPings
Nov 13 '18 at 6:35
add a comment |
The following will get you what you want. First I grabbed the contents of the txt file and put it in the $doc
variable.
Then using powershell's native "text" search feature I look for the string containing "Good Morning" and if that is true then using regex I grab all contents between the start and end text and create a new txt file with those contents. Below is the code.
$doc = Get-Content C:Scriptstest.txt
if(Select-String -InputObject $doc -Pattern "Good Morning" -SimpleMatch){
$contents = [regex]::Match($doc,'(?is)(?<=bd: Startb).*?(?=bd: Endb)')
New-Item -Path C:Scripts -Name newtest.txt -ItemType File -Value $contents
}
Else{
Write-Host "Nothing Found"
}
I tried below code. it generates output file but its blank. can we add like command instead of is start end? $doc = Get-Content "C:Usersa154499DesktoptestPS.txt" if(Select-String -InputObject $doc -Pattern "dwsn14626" -SimpleMatch){ $contents = [regex]::Match($doc,'(?is)(?<=bd: Scheduleb).*?(?=bd: Endb)') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 20:35
It is not working for me. i have many recursive entries in the file. will this script help to show multiple section in file?
– Saurabh
Nov 12 '18 at 20:58
It worked if i have only one occurrence but not working in my case because i have multiple occurrence of schedule and end statements. $doc = Get-Content "C:testPS.txt" if(Select-String -InputObject $doc -Pattern "DWSN14624"){ $contents = [regex]::Match($doc,'(?sm)(?=SCHEDULE).*?DWSN14624.*?(?=END).*') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 22:30
Separating the triggerGood Morning
from theStart
,End
markers could lead to false positives in a more complex scenario than originally given. @Saurabh Did I guess right the leadinng numbers colon are not part of the file? You should append a more real life example to your question.
– LotPings
Nov 13 '18 at 6:35
add a comment |
The following will get you what you want. First I grabbed the contents of the txt file and put it in the $doc
variable.
Then using powershell's native "text" search feature I look for the string containing "Good Morning" and if that is true then using regex I grab all contents between the start and end text and create a new txt file with those contents. Below is the code.
$doc = Get-Content C:Scriptstest.txt
if(Select-String -InputObject $doc -Pattern "Good Morning" -SimpleMatch){
$contents = [regex]::Match($doc,'(?is)(?<=bd: Startb).*?(?=bd: Endb)')
New-Item -Path C:Scripts -Name newtest.txt -ItemType File -Value $contents
}
Else{
Write-Host "Nothing Found"
}
The following will get you what you want. First I grabbed the contents of the txt file and put it in the $doc
variable.
Then using powershell's native "text" search feature I look for the string containing "Good Morning" and if that is true then using regex I grab all contents between the start and end text and create a new txt file with those contents. Below is the code.
$doc = Get-Content C:Scriptstest.txt
if(Select-String -InputObject $doc -Pattern "Good Morning" -SimpleMatch){
$contents = [regex]::Match($doc,'(?is)(?<=bd: Startb).*?(?=bd: Endb)')
New-Item -Path C:Scripts -Name newtest.txt -ItemType File -Value $contents
}
Else{
Write-Host "Nothing Found"
}
answered Nov 12 '18 at 19:34
SysEngineer
1236
1236
I tried below code. it generates output file but its blank. can we add like command instead of is start end? $doc = Get-Content "C:Usersa154499DesktoptestPS.txt" if(Select-String -InputObject $doc -Pattern "dwsn14626" -SimpleMatch){ $contents = [regex]::Match($doc,'(?is)(?<=bd: Scheduleb).*?(?=bd: Endb)') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 20:35
It is not working for me. i have many recursive entries in the file. will this script help to show multiple section in file?
– Saurabh
Nov 12 '18 at 20:58
It worked if i have only one occurrence but not working in my case because i have multiple occurrence of schedule and end statements. $doc = Get-Content "C:testPS.txt" if(Select-String -InputObject $doc -Pattern "DWSN14624"){ $contents = [regex]::Match($doc,'(?sm)(?=SCHEDULE).*?DWSN14624.*?(?=END).*') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 22:30
Separating the triggerGood Morning
from theStart
,End
markers could lead to false positives in a more complex scenario than originally given. @Saurabh Did I guess right the leadinng numbers colon are not part of the file? You should append a more real life example to your question.
– LotPings
Nov 13 '18 at 6:35
add a comment |
I tried below code. it generates output file but its blank. can we add like command instead of is start end? $doc = Get-Content "C:Usersa154499DesktoptestPS.txt" if(Select-String -InputObject $doc -Pattern "dwsn14626" -SimpleMatch){ $contents = [regex]::Match($doc,'(?is)(?<=bd: Scheduleb).*?(?=bd: Endb)') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 20:35
It is not working for me. i have many recursive entries in the file. will this script help to show multiple section in file?
– Saurabh
Nov 12 '18 at 20:58
It worked if i have only one occurrence but not working in my case because i have multiple occurrence of schedule and end statements. $doc = Get-Content "C:testPS.txt" if(Select-String -InputObject $doc -Pattern "DWSN14624"){ $contents = [regex]::Match($doc,'(?sm)(?=SCHEDULE).*?DWSN14624.*?(?=END).*') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 22:30
Separating the triggerGood Morning
from theStart
,End
markers could lead to false positives in a more complex scenario than originally given. @Saurabh Did I guess right the leadinng numbers colon are not part of the file? You should append a more real life example to your question.
– LotPings
Nov 13 '18 at 6:35
I tried below code. it generates output file but its blank. can we add like command instead of is start end? $doc = Get-Content "C:Usersa154499DesktoptestPS.txt" if(Select-String -InputObject $doc -Pattern "dwsn14626" -SimpleMatch){ $contents = [regex]::Match($doc,'(?is)(?<=bd: Scheduleb).*?(?=bd: Endb)') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 20:35
I tried below code. it generates output file but its blank. can we add like command instead of is start end? $doc = Get-Content "C:Usersa154499DesktoptestPS.txt" if(Select-String -InputObject $doc -Pattern "dwsn14626" -SimpleMatch){ $contents = [regex]::Match($doc,'(?is)(?<=bd: Scheduleb).*?(?=bd: Endb)') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 20:35
It is not working for me. i have many recursive entries in the file. will this script help to show multiple section in file?
– Saurabh
Nov 12 '18 at 20:58
It is not working for me. i have many recursive entries in the file. will this script help to show multiple section in file?
– Saurabh
Nov 12 '18 at 20:58
It worked if i have only one occurrence but not working in my case because i have multiple occurrence of schedule and end statements. $doc = Get-Content "C:testPS.txt" if(Select-String -InputObject $doc -Pattern "DWSN14624"){ $contents = [regex]::Match($doc,'(?sm)(?=SCHEDULE).*?DWSN14624.*?(?=END).*') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 22:30
It worked if i have only one occurrence but not working in my case because i have multiple occurrence of schedule and end statements. $doc = Get-Content "C:testPS.txt" if(Select-String -InputObject $doc -Pattern "DWSN14624"){ $contents = [regex]::Match($doc,'(?sm)(?=SCHEDULE).*?DWSN14624.*?(?=END).*') New-Item -Path C:tmp1 -Name newtest.txt -ItemType File -Value $contents } Else{ Write-Host "Nothing Found" }
– Saurabh
Nov 12 '18 at 22:30
Separating the trigger
Good Morning
from the Start
,End
markers could lead to false positives in a more complex scenario than originally given. @Saurabh Did I guess right the leadinng numbers colon are not part of the file? You should append a more real life example to your question.– LotPings
Nov 13 '18 at 6:35
Separating the trigger
Good Morning
from the Start
,End
markers could lead to false positives in a more complex scenario than originally given. @Saurabh Did I guess right the leadinng numbers colon are not part of the file? You should append a more real life example to your question.– LotPings
Nov 13 '18 at 6:35
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53268522%2fcopy-specific-portion-of-lines-from-a-text-file-to-separate-file-using-powershel%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
What have you tried so far? Also do you want the numbers included in your search or no?
– SysEngineer
Nov 12 '18 at 19:07
1
IF - and that is a big IF - your text is formatted as shown all the time, then take a look at the
-Context
parameter ofSelect-String
. that accepts one or two [int]s for "lines before, lines after". so-Context 3,1
will grab the 3 lines before the matching line AND the 1 line after it. [grin] ///// take a look atGet-Help Select-String -Parameter Context
for more info.– Lee_Dailey
Nov 12 '18 at 19:52