我有一个简单的文本文件,我需要一个powershell脚本来替换文件内容的某些部分.
我目前的脚本如下:
$content = Get-Content -path "Input.json"
$content -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json"
Run Code Online (Sandbox Code Playgroud)
是否可以在没有内容变量的情况下将其写入一行,如下所示?
Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json"
Run Code Online (Sandbox Code Playgroud)
我不知道如何在没有$ content变量的情况下在第二个命令中使用第一个get-content命令行开关的输出?是否有自动PowerShell变量
是否有可能比管道中的替换更多.
Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' | Out-File "output.json"
Run Code Online (Sandbox Code Playgroud) 在正则表达式中匹配重复的字符很简单,使用反向引用:
(.)\1
Run Code Online (Sandbox Code Playgroud)
但是,我想在这对角色之后匹配角色,所以我想我可以简单地将它放在一个后视镜中:
(?<=(.)\1).
Run Code Online (Sandbox Code Playgroud)
这是为什么?在其他方面,我不会感到惊讶,因为对lookbehinds有强烈的限制,但.NET通常支持lookbehinds中任意复杂的模式.
我正在尝试将一个字符串传递给程序的STDIN 而没有任何尾随换行符(除非该字符串本身实际上以换行符结束).我试过谷歌搜索,但我只发现有人试图打印到控制台没有拖尾换行,在这种情况下Write-Host需要一个参数-NoNewLine.但是,要将它传输到另一个程序,我需要Write-Output或类似的没有这样的参数.现在似乎Write-Output甚至不是问题:
Z:\> (Write-Output "abc").Length
3
Run Code Online (Sandbox Code Playgroud)
但是,只要我将它传送到另一个程序并在那里读取字符串,我就会得到一个额外的换行符.例如,我尝试了这个Ruby片段:
Z:\> Write-Output "abc" | ruby -e "p ARGF.read"
"abc\n"
Run Code Online (Sandbox Code Playgroud)
我检查了收到的实际字符串是abc\n.其他几种语言(至少是C#,Java和Python)也是如此,所以我认为这是PowerShell的一个问题,而不是阅读的语言.
作为进一步的测试,我Write-Output用另一个Ruby脚本替换自己:
Z:\> ruby -e "$> << 'abc'"
abcZ:\>
Run Code Online (Sandbox Code Playgroud)
(也就是说,\n脚本的STDOUT 肯定没有.)
但是,当我将它传递到另一个脚本时:
Z:\> ruby -e "$> << 'abc'" | ruby -e "p ARGF.read"
"abc\n"
Run Code Online (Sandbox Code Playgroud)
我相信它是添加换行的管道.我该如何避免?我实际上希望能够控制输入是否以换行结束(通过将其包含在输入中或省略它).
(作为参考,我还测试了已包含尾随换行符的字符串,在这种情况下,管道不会添加另一个换行符,所以我猜它只是确保拖尾换行符.)
我最初在PowerShell v3中遇到过这种情况,但我现在正在使用v5,但仍然存在同样的问题.
TL; DR:在.NET的lookbehinds中使用捕获(特别是平衡组)会改变获得的捕获,尽管它不应该有所作为.什么是.NET的外观打破了预期的行为?
我试图找到另一个问题的答案,作为借助.NET平衡组的借口.但是,我不能让他们在可变长度的lookbehind内工作.
首先,请注意我并不打算高效地使用这个特定的解决方案.这更多是出于学术原因,因为我觉得可变长度的lookbehind有一些我不知道的事情.并且知道这可能在将来派上用场,当我真的需要使用这样的东西来解决问题时.
考虑这个输入:
~(a b (c) d (e f (g) h) i) j (k (l (m) n) p) q
Run Code Online (Sandbox Code Playgroud)
我们的目标是匹配所有的字母,这是由前括号内~,没有多么深跌(所以一切从a到i).我的尝试是检查后视镜中的正确位置,以便我可以通过一次调用获得所有字母Matches.这是我的模式:
(?<=~[(](?:[^()]*|(?<Depth>[(])|(?<-Depth>[)]))*)[a-z]
Run Code Online (Sandbox Code Playgroud)
在lookbehind我尝试找到一个~(,然后我使用命名组堆栈Depth来计算无关的开括号.只要打开的括号~(永远不会关闭,那么lookbehind应该匹配.如果到达(?<-Depth>...)那个右括号,则无法从堆栈中弹出任何内容,并且lookbehind应该失败(即,对于所有来自的字母j).不幸的是,这不起作用.相反,我匹配a,b,c,e,f,g和m.所以只有这些:
~(a b (c) _ (e f (g) _) _) _ (_ (_ (m) _) _) _
Run Code Online (Sandbox Code Playgroud)
这似乎意味着,一旦我关闭了一个单一的括号,看起来就无法匹配任何东西,除非我回到我以前最高的嵌套水平.
好吧,这可能只是意味着我的正则表达式有些奇怪,或者我没有正确理解平衡组.但后来我尝试了这个没有外观.我为每个字母创建了一个字符串,如下所示:
~(z …Run Code Online (Sandbox Code Playgroud) 我刚刚更详细地了解了这两个概念.我一直对RegEx很好,似乎我从未见过需要这两个零宽度断言.
我很确定我错了,但我不明白为什么需要这些结构.考虑这个例子:
Match a 'q' which is not followed by a 'u'.
Run Code Online (Sandbox Code Playgroud)
将输入2个字符串:
Iraq
quit
Run Code Online (Sandbox Code Playgroud)
使用负向前瞻,正则表达式如下所示:
q(?!u)
Run Code Online (Sandbox Code Playgroud)
没有它,它看起来像这样:
q[^u]
Run Code Online (Sandbox Code Playgroud)
对于给定的输入,这两个正则表达式给出相同的结果(即匹配Iraq但不是quit)(用perl测试).同样的想法适用于lookbehinds.
我错过了一个关键特性,使这些断言比经典语法更有价值吗?
这是在Sublime Text 2的Ruby包中的一个片段文件中找到的Perl样式的正则表达式:
/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g
Run Code Online (Sandbox Code Playgroud)
我知道它将像"some_class.rb"这样的文件名转换为"SomeClass",但我无法弄清楚这部分是做什么的:(?2::.Sublime Text 2使用boost作为其正则表达式,所以我检查了Boost-Extended Format String Syntax的文档,我发现boost支持格式字符串(f.inst.(?2(foo):(bar)))中的条件,但你永远不需要两个冒号.另外,?2将指向第二个子表达式,但上面的表达式只匹配一个子表达式.出于这些原因,我不认为这是一个条件表达式.
感谢任何有启发性的答案.
我必须从PDF文件目录中获取文件.我有问题,我没有一个字段来整合所有数据来查找文件.
这是一个例子:
文件名:
Comp_20120619_170310_2_632128_FC_A_8_23903.pdf
Run Code Online (Sandbox Code Playgroud)
文件名生成:
Comp_20120619_--------_2_632128_FC_A_8_23903.pdf
Run Code Online (Sandbox Code Playgroud)
我没有'字段"--------"使文件COMPLETE名称.
我正在尝试,File.list但我找不到正确的文件.
我试图从Magento的后端找到默认的商店代码.虽然这听起来很简单,但我找不到任何解决方案.
我找到的片段也是
Mage::app()->getStore()->getCode()
Run Code Online (Sandbox Code Playgroud)
(虽然这不符合默认值但对应当前商店)或
Mage::app()->getStore(Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID)->getCode();
Run Code Online (Sandbox Code Playgroud)
但是从后端内部这些只返回"admin"(因为后端被视为某种特殊商店,商店ID为0 - 这是值DEFAULT_STORE_ID).有谁可以请我指出从任何地方获取实际默认商店代码的方法?(由Magento的设置如果"添加商店代码到URL"和"自动重定向到基本URL"选项被激活,那家商店代码)
我只需要一些背景知识:我需要在Magento配置中生成一个URL,如果激活了"向URL添加存储代码",它仍然有效.我可以设置任何商店代码,所以如果我在其中一个的配置范围内,我可以使用那个.但是,如果配置范围设置为默认或网站,它也必须工作,我想在这种情况下使用默认的商店代码.
提前致谢!
编辑:我找到了一个解决方案:
$websites = Mage::app()->getWebsites();
$code = $websites[1]->getDefaultStore()->getCode();
Run Code Online (Sandbox Code Playgroud)
但是,这给我留下了一些后续问题.
为什么Mage::app()->getWebsite()返回一个只包含特殊admin商店的特殊网站对象,同时Mage::app()->getWebsites()返回一个只包含通常的前端网站的数组,而不是返回的对象getWebsite()?
为什么前端网站对象占用数组中的索引1,而索引0未使用?我真的很想知道在那里使用幻数的原因(如果必须的话).
Google Analytics不再允许在其过滤器中使用否定前瞻功能.事实证明,创建自定义报告非常困难,只包括我希望包含的链接.
包含负向前瞻的正则表达式如果启用它将起作用:
test.com(\/\??index\_(.*)\.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)
Run Code Online (Sandbox Code Playgroud)
匹配:
test.com
test.com/
test.com/index_fb2.php
test.com/index_fb2.php?ref=23
test.com/index_fb2.php?ref=23&e=35
test.com/?ref=23
test.com/?ref=23&e=35
Run Code Online (Sandbox Code Playgroud)
并且不匹配(应该如此):
test.com/ambassadors
test.com/admin/?signup=true
test.com/randomtext/
Run Code Online (Sandbox Code Playgroud)
我正在寻找如何调整我的正则表达式仍然保持相同的匹配,但没有使用负前瞻.
谢谢!
我有一个表格,其中包含一个字符串,如下所示:
static-text-here/1abcdefg1abcdefgpxq
Run Code Online (Sandbox Code Playgroud)
从这个字符串1abcdefg重复两次,所以我想删除该部分字符串,并返回:
static-text-here/1abcdefgpxq
Run Code Online (Sandbox Code Playgroud)
我不能保证重复字符串的长度.在纯SQL中,如何执行此操作?
regex ×8
.net ×2
powershell ×2
boost ×1
directory ×1
file ×1
filter ×1
java ×1
linefeed ×1
lookaround ×1
magento ×1
magento-1.x ×1
oracle ×1
php ×1
sql ×1
stdin ×1
sublimetext2 ×1