【问题标题】:Perl unable to read in variable to replace words [ksh]Perl 无法读取变量以替换单词 [ksh]
【发布时间】:2018-01-09 02:33:21
【问题描述】:

我有一个名为 123.txt 的文本文件 在 123.txt 它包含

还可以 % : 很好
不行 % : 很糟糕

我的工作是将单词从 "is OK %" 替换为 okay can %

我当前的代码(不工作)

$temp_var="is okay \%"
perl -pi -e 's/$temp_var/okay can \%/g' *123.txt

在 % 上加上反斜杠来处理特殊字符的原因。

我曾尝试将 sed -i 用于我以前的编码,但它没有成功,因为 -i 不是经典界面的一部分,我尝试放置 's/is ok \%/okay可以 \%/g' 代替 $temp_var 并且它能够工作。

我不太确定这是我转换变量的方式还是 $temp_var 无法在 PERL 中读取

谢谢!

【问题讨论】:

  • % 不是正则表达式文字或正则表达式模式中的特殊字符。

标签: perl unix ksh


【解决方案1】:

s/$temp_var/okay can \%/g 中,$temp_var 指的是 Perl 变量。除了 ksh 进程知道它的变量之外,什么都没有。您需要将其值提供给 Perl。


硬编码:

perl -i -pe's/is okay %/okay can %/g' *123.txt

通过参数:

text='is okay %'
perl -i -pe'
   BEGIN { $text = shift(@ARGV); }
   s/\Q$text/okay can %/g;
' "$text" *123.txt

通过环境变量:

text='is okay %'
TEXT="$text" perl -i -pe's/$ENV{TEXT}/okay can %/g' *123.txt

通过环境变量:

export TEXT='is okay %'
perl -i -pe's/$ENV{TEXT}/okay can %/g' *123.txt

注意:"\Q$text\E" 创建一个匹配$text 值的正则表达式。 (后面的\E 可以省略。)

【讨论】:

  • 你好我可以知道 BEGIN { $text = shift(@ARGV); }这是什么意思?
  • 在编译时(即在-p创建的循环之前),抓取并删除第一个参数。
  • 如何添加额外的 $text2 示例 s/\Q$text $test2/okay 可以 %/g; ' "$text $text2" *123.txt ... 这违反了吗?
【解决方案2】:

你的替代品对我有用,唯一不同的是我还在 oneliner 本身中声明了变量 $temp_var。

$ cat so45451136.txt
is okay % : That's good
not okay % : That's bad

$ perl -pe '$temp_var="is okay \%";s/$temp_var/okay can \%/g;' so45451136.txt 
okay can % : That's good
not okay % : That's bad

【讨论】:

  • OP 可能希望继续使用 $temp_var 的值,而不是硬编码该值。如果他们对硬编码值没意见,为什么要以如此复杂的方式呢?
  • 你好@ikegami 因为我必须多次使用这个变量,所以变量将是一个更好的选择。
  • @permanent409 除了在 oneliner 中声明为实际值之外的任何替代方法,它是一个函数参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
相关资源
最近更新 更多