从文件夹中的所有文本文件中提取与模式匹配的行到单个输出文件

     2023-02-22     199

关键词:

【中文标题】从文件夹中的所有文本文件中提取与模式匹配的行到单个输出文件【英文标题】:Extract lines matching a pattern from all text files in a folder to a single output file 【发布时间】:2017-04-24 11:37:26 【问题描述】:

我正在尝试提取文件夹中所有文件中以“%%”开头的每一行,然后将这些行复制到单独的文本文件中。目前在 PowerShell 代码中使用此代码,但我没有得到任何结果。

$files = Get-ChildItem "folder" -Filter *.txt
foreach ($file in $files)

if ($_ -like "*%%*")

Set-Content "Output.txt" 
  

【问题讨论】:

使用了这段代码,我在这里做错了 $files = Get-ChildItem "FOLDER" -Filter *.txt foreach ($file in $files) (Select-String -Path *. txt -Pattern '^%%').Line |设置内容“Output.txt” 【参考方案1】:
ls *.txt | %
$f = $_
  gc $f.fullname | 
     if($_.StartWith("%%") -eq 1)
        $_ >> Output.txt
     #end if
  #end gc
#end ls

别名

ls - Get-ChildItem
gc - Get-Content
% - ForEach
$_ - Iterator variable for loop
>> - Redirection construct
# - Comment

http://ss64.com/ps/

【讨论】:

【参考方案2】:

首先你必须使用

获取内容

为了得到文件的内容。然后您进行字符串匹配,并在此基础上再次将内容设置回文件。使用 get-content 并在 foreach 中放置另一个循环来迭代文件中的所有行。

我希望这个逻辑可以帮助你

【讨论】:

【参考方案3】:

Select-String cmdlet 提供了一个更简单的解决方案(PSv3+ 语法):

(Select-String -Path folder\*.txt -Pattern '^%%').Line | Set-Content Output.txt

Select-String 通过其-Path 参数接受文件名/路径模式,因此,在这种简单的情况下,不需要Get-ChildItem

相比之下,如果您输入的文件选择是递归的或使用更复杂的标准,您可以将Get-ChildItem 的输出通过管道传输到Select-String,如Dave Sexton's helpful answer 中所示。 请注意,according to the docs、Select-String 默认假定输入文件是 UTF-8 编码的,但您可以使用 -Encoding 参数更改它;还要考虑下面讨论的输出编码。

Select-String-Pattern 参数需要正则表达式,而不是通配符表达式。^%% 仅匹配开头的文字%% (^) 一行。

Select-String 输出[Microsoft.PowerShell.Commands.MatchInfo] 对象,其中包含有关每个匹配项的信息;每个对象的.Line 属性包含匹配的输入行的全文。

Set-Content Output.txt 将所有匹配的行发送到单个输出文件Output.txt

Set-Content 使用系统的旧版 Windows 代码页(8 位单字节编码 - 尽管 documentation 错误地声称生成了 ASCII 文件)。 如果要显式控制输出编码,请使用-Encoding 参数;例如,... | Set-Content Output.txt -Encoding Utf8。 相比之下,>,输出重定向运算符总是创建 UTF-16LE 文件(编码 PowerShell 调用Unicode),Out-File 默认情况下也是如此(可以用-Encoding更改)。 另请注意,> / Out-File 将 PowerShell 的默认格式应用于输入对象以获取要写入输出文件的字符串表示形式,而 Set-Content 将输入视为 strings(调用 @987654353 @ 在输入对象上,如有必要)。在本例中,由于所有输入对象都已经是字符串,因此没有区别(可能除了字符编码)。

至于你尝试了什么

$_ 在您的foreach ($file in $files) 中指的是一个文件(一个[System.IO.FileInfo] 对象),因此您可以根据输入文件的name 而不是它的内容

除此之外,通配符模式 *%%* 将匹配输入字符串中的 %% anywhere,而不仅仅是在其 start 处(你会改为使用%%*)。

Set-Content "Output.txt" 调用缺少 输入,因为它不是管道的一部分,并且在没有管道输入的情况下,没有传递 -Value 参数。

但是,即使您确实提供了输入,输出文件 Output.txt 也会在您的 foreach 循环的每次迭代整体重写

【讨论】:

【参考方案4】:

我认为 mklement0 建议使用Select-String 是可行的方法。添加到他的答案中,您可以将Get-ChildItem 的输出通过管道传输到Select-String 中,这样整个过程就变成了Powershell one liner。

类似这样的:

Get-ChildItem "folder" -Filter *.txt | Select-String -Pattern '^%%' | Select -ExpandProperty line | Set-Content "Output.txt"

【讨论】:

sed用法

...式空间开端至内容,并追加到默认输出之前?h:把模式空间中的内容覆盖至保持空间中?H:把模式空间中的内容追加至保持空间中?g:从保持空间取出数据覆盖至模式空间?G:从保持空间取出内容追加至模式空间?x:把模式空间中的内... 查看详情

从 .cpp 文件中提取与模式匹配的“if”块

...题描述】:我正在尝试将表达式匹配特定模式的C++代码库中的任何“if”块复制到文本文件。这可能使用grep/awk/sed等的某种组合吗?示例如果我的文件包含以下代码://File1.cppif(/*matching-expr 查看详情

csv 文件中的模式匹配并附加到匹配的行

】csv文件中的模式匹配并附加到匹配的行【英文标题】:PatternMatchinginacsvfileandappendingtomatchedlines【发布时间】:2014-10-0501:15:01【问题描述】:我想将这些行提取到一个与Pattern匹配的csv文件中,然后将相同的Pattern附加到每个提取... 查看详情

sed文本处理工具常见用法

...式的文本处理工具,它默认不会修改源文件,它是把文件中的内容逐行copy到缓冲区,然后在缓冲区中进行处理,最后把处理的结果显示到屏幕上并清空缓冲区然后再从文件中读取下一行到缓冲区,重复这个过程,直到所有的行... 查看详情

打印文件中从匹配行到文件末尾的行数(代码片段)

...gt;sed.exe-n-e"1,/needle/p"haystack.txtabcdefghineedle打印匹配行后的所有内容>sed.exe-n-e"1,/needle/!p"haystack.txtwant1want 查看详情

sed命令详解

...家关注原文网站sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中... 查看详情

linux三剑客(sed)-编辑匹配到的文本

...原始文件:2.sed的默认动作(1)sed的默认动作是打印文件中的所有行。3.打印特定行(1)因为sed命令默认打印文件中所有行。所以第三行会被打印两遍。那如何只打印第三行呢?使用【-n】命令,只打印匹配的行。(2)使用【-n... 查看详情

如何从pyspark中的文件中匹配/提取多行模式

】如何从pyspark中的文件中匹配/提取多行模式【英文标题】:Howtomatch/extractmulti-linepatternfromfileinpysark【发布时间】:2019-08-1417:58:11【问题描述】:我有一个巨大的rdf三元组(主谓宾)文件,如下图所示。它提取粗体项目并具有以... 查看详情

从 CSV 文件中删除与 bash 中另一个文件中的行匹配的行? [复制]

】从CSV文件中删除与bash中另一个文件中的行匹配的行?[复制]【英文标题】:RemovelinesfromCSVfilethatmatcheslinesfromanotherfilefrombash?[duplicate]【发布时间】:2021-11-0100:16:12【问题描述】:我有一个(大)CSV文件(A),其结构如下:1234ABC4567... 查看详情

从文件中读取索引“n”低于与给定正则表达式匹配的行的所有行

...文件中读取索引“n”低于与给定正则表达式匹配的行的所有行【英文标题】:Readfromfilealllinesthathaveanindex`n`lowerthanthelinesthatmatchagivenregex【发布时间】:2017-11-1305:26:10【问题描述】:我想从文件file.txt中读取索引n低于匹配给定正... 查看详情

在文本字符串中搜索模式,然后提取匹配的模式

】在文本字符串中搜索模式,然后提取匹配的模式【英文标题】:SearchforPatterninTextString,thenExtractMatchedPattern【发布时间】:2017-08-0412:04:48【问题描述】:我正在尝试匹配然后从文本字符串中提取模式。我需要在文本字符串中提取... 查看详情

从VBA中的PowerPoint文件中提取所有文本

】从VBA中的PowerPoint文件中提取所有文本【英文标题】:ExtractingalltextfromapowerpointfileinVBA【发布时间】:2011-06-0804:30:18【问题描述】:我有大量的powerpoint文件,我想从中提取所有文本,然后将它们全部集中到一个大文本文件中。... 查看详情

java如何从文件中打印与给定模式匹配的所有字符串?

在Java编程中,如何从文件中打印与给定模式匹配的所有字符串?以下示例显示了如何使用Util.regex类的Patternname.matcher()方法从文件中打印与给定模式匹配的所有字符串。packagecom.yiibai;importjava.util.regex.*;importjava.io.*;publicclassPatternMat... 查看详情

Linux Bash - 修改从标准输出中提取的文本

...】:2021-03-2810:51:11【问题描述】:我想递归扫描给定目录中的所有.zip文件,使用ApacheTika(在我的情况下是/opt/solr/bin/post脚本)从每个这样的文件中提取文本到单个文本文件中并将该文本文件进入原始zip文件所在的同一目录。递... 查看详情

sed命令

...指定文件的文本至模式空间中匹配到的行后=为模式空间中的行打印行号!模式空间中匹配行取反处理?s///查找替换,支持使用其它分隔符,[email protected]@@,s###?替换标记:g行内全局替换p显示替换成功的行w/PATH/FILE将替换成功的... 查看详情

如何从单个文本文件中提取不同的文章?

】如何从单个文本文件中提取不同的文章?【英文标题】:Howtoextractdifferentarticlesfromasingletextfile?【发布时间】:2021-10-2723:21:06【问题描述】:我有一个收集报纸文章的.rtf/.txt文件。The.rtffilecanbefoundhere。Andthe.txtfilecanbefoundhere.我... 查看详情

#grep‘linux’filename命令查找的是啥文件?

...ExpressionPrint,表示全局正则表达式版本,它的使用权限是所有用户。2.格式grep[options]3.主要参数[options]主要参数:-c:只输出匹配行的计数。-I:不区分大小写(只适用于单字符)。-h:查询多文件时不显示文件名。-l:查询多... 查看详情

从Python中的json文件中的特定字段中提取文本

】从Python中的json文件中的特定字段中提取文本【英文标题】:ExtractingtextfromaspecificfieldinajsonfileinPython【发布时间】:2022-01-0522:47:04【问题描述】:我的JSON看起来像这样(但有很多这样的行):"text":"Home-HomepagedesKunstvereinsProArsLaus... 查看详情