在包含特定字符串的行的开头和结尾追加字符串

时间:2016-08-29 23:03:54

标签: perl

所有 我想知道如何使用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;

这不是我想要的。

谢谢

3 个答案:

答案 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

  1. 级联

    使用.将两个字符串连接在一起。您可以将操作链接在一起以组成更长的字符串。

    my $str = '%abc %efd';
    $str = '123 ' . $str . ' 456';
    say $str; # prints "123 %abc %efd 456" with a trailing newline
    
  2. 插值

    用双引号括起一个字符串,指示Perl插入(即查找并评估)字符串中包含的任何Perl样式变量。

    my $str = '%abc %efd';
    $str = "123 $str 456";
    say $str; # prints "123 %abc %efd 456" with a trailing newline
    
  3. 您会注意到,在两个示例中,我们都在前面并附加到现有字符串中。您还可以创建新变量来保存这些操作的结果。其他操纵和构建字符串的方法包括printfsprintf函数,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*仅匹配非空白字符;如果您需要匹配包含空格的字符串,则需要更新此表达式(.*?之类的内容可能适用于您)。