我在办公室接手了一个项目,我似乎找不到答案。我试图写一个Powershell脚本使用Regex来替换文本在特定领域的多行逗号分隔CSV文件,但我替换的文本可能存在于其他领域。
例如,在以下数据中:
Smith,Robert,W,11111 N 400 W,Some City,Some State,Some Zip
字符串
我需要将第四列中的W
替换为West
,但我不希望第三列(或其他列)中的W
被更改。至少,我可以让它搜索第n个逗号之后的任何匹配项,因为街道地址后面的字段大多是数字,但理想情况下,最好只搜索特定的列,以防将来在其他地方有匹配的文本。
我已经找到了一些提示和正则表达式脚本,似乎让我接近,但我挣扎着让它工作测试它与记事本++。有些脚本搜索到第n个逗号,有些脚本似乎从行尾开始向后搜索(这不起作用,因为有带逗号的文本字段)。到目前为止,我在PowerShell脚本中得到的最接近的是:
-replace('^(?:[^,]*\,){3}([^,]*)\bW\b', 'West')
型
但这将用West
替换W
及其之前的所有内容。
很可能还有更好的方法来做到这一点,但我已经花了比我预期的更多的时间。如有任何帮助,将不胜感激!
4条答案
按热度按时间5fjcxozz1#
相当直接。你尝试的正则表达式非常接近。
第四列中
W
之前的值必须与West沿着写回在替代品中。
这是一种便携式解决方案。
字符串
替换
$1West
https://regex101.com/r/zLlP7L/1
型
d6kp6zgx2#
使用Notepad++:
^(?:[^,]*\,){3}[^,]*?\KW
West
个**TICK 匹配案例 *
***滴答 * 缠绕 *
***SELECT * 正则表达式 *
说明:
字符串
前截图:
的数据
后截图:
的
fjaof16o3#
您可以使用lookbehind来执行Assert,而不匹配这些内容(请注意,
,
不需要转义):字符串
假设
$string
是您的输入,这里有一个简短的Powershell代码段:(免责声明:我不太了解Powershell。
型
注意,Powershell有built-in support来解析CSV文件。你可能想用它来避免任何潜在的问题。
试试tio.run。
试试on regex101.com。
jrcvhitl4#
在这种情况下,我通常会编写一些有点冗长的正则表达式,但这确实有效。
在这种情况下,我会这样做:
第一个月
虽然我不确定正则表达式在powershell中是如何工作的,但有时你应该使用
$1
,$2
,...或者甚至%1
、%2
、…但我相信\1
,\2
,...是最常见的。解释/细分:
^
:匹配行的开头([^,]*)
匹配任何不是逗号的字符。这将是我们的第一个捕获组\1
,
匹配文字逗号([^,]*),([^,]*),
另外两个不带逗号的捕获组,用于\2
和\3
。([^,]*)\bW\b,
匹配捕获组\4
中不带逗号的内容,然后是W
,然后是逗号。替换为:
\1,\2,\3,\4West
,我们使用捕获组,然后向西。