所有 我想知道如何使用perl在包含特定字符串的行的开头和结尾追加字符串?
例如,我的行包含: %abc%efd; 我想在行的开头追加123,在行的末尾追加456,所以它看起来像这样:
123%abc%efd 456
8/30/16 UPDATE -------------------------------- 到目前为止,我做过类似的事情:
foreach文件(find . -type f
)
perl -ne's / ^ \%abc \ s +(\ S *)/ ** \%abc $ 1 /;打印;' $ file> TMP; mv tmp $文件
端
foreach文件(find . -type f
)
perl -ne的/ $ \%def \; \ s +(\ S *)/ \%def \; ** \ n $ 1 /;打印;' $ file> TMP; mv tmp $文件
端
所以这很好,除非abc和def不在一个字符串中。 例如:
%abc
东西的东西
%def
这将是结果
%abc
东西的东西
%def;
这不是我想要的。
谢谢
答案 0 :(得分:0)
在你的情况下,你想在文件行匹配某个字符串时追加字符串,这意味着匹配和替换。
首先,阅读输入文件的每一行。
其次,检查它是否与要将字符串追加到开头和结尾的字符串匹配。
然后用新字符串替换匹配字符串,该字符串包含额外的开始字符串,匹配字符串和附加结束字符串。
%abc %efd
asdahsd
234234
%abc
%efd
%abc%efd
尝试输入文件如下:
123 %abc %efd 456
asdahsd
234234
%abc
%efd
%abc%efd
您将收到我们预期的结果:
from PIL import Image
from pytesseract import image_to_string
myText = image_to_string(Image.open("tmp/test.jpg"),config='-psm 10')
myText = image_to_string(Image.open("tmp/test.jpg"))
根据您的要求修改代码,如果有任何问题,请与我联系。
答案 1 :(得分:0)
使用m
修饰符逐行替换开头和结尾。
s/^\%abc/123 $&/mg;
s/\%def$/ 456/mg;
一起使用,作为/ ms,他们让“。”匹配任何字符,同时仍允许“^”和“$”分别匹配字符串中的换行符之后和之前。 source
答案 2 :(得分:-1)
欢迎使用StackOverflow。我们努力帮助人们解决现有代码中的问题并学习语言,而不是简单地回答一次性问题,可以在101个教程和文档中轻松找到解决方案。您发布的问题类型并没有留下很大的学习空间,并且对帮助未来的学习者没有太大帮助。如果你能发布一个更完整的例子,包括你到目前为止所做的尝试,它将对我们有所帮助。
所有这些,在Perl中有两种主要的方式来预先添加和附加到字符串:1。concatenation运算符,.
和2.字符串interpolation。
级联
使用.
将两个字符串连接在一起。您可以将操作链接在一起以组成更长的字符串。
my $str = '%abc %efd';
$str = '123 ' . $str . ' 456';
say $str; # prints "123 %abc %efd 456" with a trailing newline
插值
用双引号括起一个字符串,指示Perl插入(即查找并评估)字符串中包含的任何Perl样式变量。
my $str = '%abc %efd';
$str = "123 $str 456";
say $str; # prints "123 %abc %efd 456" with a trailing newline
您会注意到,在两个示例中,我们都在前面并附加到现有字符串中。您还可以创建新变量来保存这些操作的结果。其他操纵和构建字符串的方法包括printf
和sprintf
函数,substr
函数,join
函数和regular expressions,所有这些都将使用遇到你继续学习Perl。
在执行操作之前查看字符串是否包含某个子字符串,可以使用index
函数或正则表达式:
if (index($str, '%abc %efd') >= 0) {
# or...
if ($str =~ /%abc %efd/) {
请记住Perl脚本顶部的use strict;
并且始终(至少在您学习的时候)使用my
声明变量。如果您在使用say
函数时遇到问题,则可能需要将语句use feature 'say';
添加到脚本的顶部。
您可以在learn.perl.org找到优秀Perl教程的索引。祝你好运,玩得开心!
更新以下(我相信)对您修改过的问题的完整答案:
find . -type f -exec perl -i.bak -pe's/^(%abc)\s+(\S*)\s+(%def;)$/**\1 \2 \3**/'
这将修改文件并创建扩展名为.bak的备份文件。请记住,表达式\S*
仅匹配非空白字符;如果您需要匹配包含空格的字符串,则需要更新此表达式(.*?
之类的内容可能适用于您)。