我有下表:
column1 column2
1 aaa^bbb
2 aaa^bbb|ccc^ddd
Run Code Online (Sandbox Code Playgroud)
我想有一个输出文件如下:
column1 column2 column3
1 aaa bbb
2 aaa bbb
3 ccc ddd
Run Code Online (Sandbox Code Playgroud)
如果有聪明的方法,你能不能让我知道吗?
我试图做两件事;
对于^,我想将上下文分为第2列和第3列.
对于|,我想将它分隔到下一行,但在column1中保持相同的数字(第1行和第3行的列1相同.抱歉,我在这里犯了一个错误.
要重写,输入如下:
column1 column2
x aaa^bbb
y aaa^bbb|ccc^ddd
Run Code Online (Sandbox Code Playgroud)
输出如下:
column1 column2 column3
x aaa bbb
y aaa bbb
y ccc ddd
Run Code Online (Sandbox Code Playgroud) 我试图从替换函数中获取被替换(实际上,已删除)的内容.
例如:
my $line = q{hello "my" friend "how" are 'you'};
$line =~ s/("[^"]*"|'[^']*')//g; # Removing any balanced quotes
# I'd like to print
# "my" "how" 'you'
Run Code Online (Sandbox Code Playgroud)
请善待,我从Perl开始:-).
我想用另一个名字改变密钥.尝试下面的代码,但得到一些错误:
my @array = qw(1 hello ue hello 3 hellome 4 hellothere);
my %hash = @array;
foreach (Keys %hash) {
s/ue/u/g;
}
Run Code Online (Sandbox Code Playgroud)
输出错误:test.pl第35行的非法模数为零.
我想使用正则表达式用开头括号替换正斜杠,用逗号分隔.例如,对于
$str = "c/g/c/g/c/g/c/g";
Run Code Online (Sandbox Code Playgroud)
结果应该是
$str = "c),(g),(c),(g),(c),(g),(c),(g";
Run Code Online (Sandbox Code Playgroud)
我写了以下这一行,但它不起作用
$observed = ~ s///);(//;
Run Code Online (Sandbox Code Playgroud)
任何建议如何解决它
我有字符串"12,34,56,789,George Carter,4".我希望输出看起来像:
12 34 56 789 George Carter 4
Run Code Online (Sandbox Code Playgroud)
我目前的代码不适合我.我试过了:
str = "12,34,56,789,George Carter,4"
str.split(",")
Run Code Online (Sandbox Code Playgroud) 我有一个包含超过一百万行文本的文本文件.在每一行上都有一个字母数字代码,需要用名字代替.我尝试使用不同的Perl脚本执行此操作,但每次脚本因为使用太多内存而死亡.我是Perl的新手,所以我想我做错了什么,这使得工作太复杂了?到目前为止,我尝试过:
use strict;
use warnings;
my $filename = 'names.txt';
my $data = read_file($filename);
$data =~ s/88tx0p/Author1/g;
##and then there are 1,000,000+ other substitution regexes.
write_file($filename, $data);
exit;
sub read_file {
my ($filename) = @_;
open my $in, '<:encoding(UTF-8)', $filename or die "Could not open
'$filename' for reading $!";
local $/ = undef;
my $all = <$in>;
close $in;
return $all;
}
sub write_file {
my ($filename, $content) = @_;
open my $out, '>:encoding(UTF-8)', $filename or die "Could not open
'$filename' …Run Code Online (Sandbox Code Playgroud) 我注意到当直接在终端中时,很容易将替换链接在一起:
perl -p -i -e 's/\xa/\xd/g; s/(<ACROSS PUZZLE>.+<GRID>\r\t)([A-Z\.]{15,})(\r\t.+)/\2/g' _temp.txt;
Run Code Online (Sandbox Code Playgroud)
但是,我没有成功地将两个替换组合在一起,因为我重写了我拥有的一些脚本。目前,作为两个单独的语句,它可以工作,但我不确定如何将这两行组合在一起:
$thisGrid =~ s/\xa/\xd/g;
$thisGrid =~ s/(<ACROSS PUZZLE>.+<GRID>\r\t)([A-Z\.]{15,})(\r\t.+)/\2/g;
Run Code Online (Sandbox Code Playgroud)
首先我试过:
$thisGrid =~ s/\xa/\xd/g =~ s/(<ACROSS PUZZLE>.+<GRID>\r\t)([A-Z\.]{15,})(\r\t.+)/\2/g;
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用。
其他类似的线程似乎没有回答我的问题。
我遇到了这个非常漂亮和方便的命令
:.,$/^\d\+/\=submatch(0) + 1/g
Run Code Online (Sandbox Code Playgroud)
它的作用是查找当前行之后的任何行,并检查该行是否以数字开头。如果是,它将用其当前值的增量替换它;然而,我对这实际上是如何发生的感到很困惑。我猜这\=submatch(0)部分是在做繁重的工作,但我不知道如何做。还有一个+ 1aftersubmatch充当算术,这让我感到惊讶。我原以为它会作为文本插入,而不是对匹配的数字执行算术运算。
我有 10 个文件,每个文件都包含“apple”和“red”。我想在所有 10 个文件中将“苹果”更改为“梨”并将“红色”更改为“绿色”。
我目前的方法是:%s/apple/pear/g在每个文件中输入这个查找和替换命令(对于红色到绿色也是如此)。如何保存这两个替换并将它们应用于 10 个文件。更一般地说,我如何更有效地做到这一点?
我是 vim 的新手,不确定是否查看命令历史记录或 vim 寄存器或其他内容。
我有一个包含以下内容的文件:
foo1 = 1
foo2 = 2
foo3 = 8
.
.
.
Run Code Online (Sandbox Code Playgroud)
我需要用一部分内存哈希值替换该文件中的值(1,2,8 ...),具有相同键的值(foo1 - > 33,foo2 - > 44,foo3 ......)如何使用"s ///"运算符更改它?如果有其他优雅的方式来进行,我会很高兴知道.
谢谢你的帮助,
Yohad.
我有一个函数,它将函数列表作为参数.
library(moments)
library(plyr)
tests <- list(mean, varience, skewness, kurtosis)
f <- function(X, tests){
out <- each(... = tests)(X) #each from plyr
names(out) <- GetNames(tests)
out
}
Run Code Online (Sandbox Code Playgroud)
我想GetNames获取对象列表,在本例中为函数,并将对象的名称作为文本返回.理想情况下,我想GetNames使用任何命名对象列表:
> GetNames(tests)
[1] "mean" "varience" "skewness" "kurtosis"
Run Code Online (Sandbox Code Playgroud)
as.character(tests) 返回每个函数的代码文本,而不是它们的名称.
我试过了:
GN <- function(X) deparse(substitute(X))
GetNames <- function(X) lapply(tests, GN)
GetNames(tests)
Run Code Online (Sandbox Code Playgroud)
但这回归:
[[1]]
[1] "X[[i]]"
[[2]]
[1] "X[[i]]"
[[3]]
[1] "X[[i]]"
[[4]]
[1] "X[[i]]"
Run Code Online (Sandbox Code Playgroud)
在编写R代码时,我经常遇到这个问题的一些版本.我想要一个函数来评估它的参数的一些步骤,这里从tests它的对象的名称开始一步,然后停止并让我对结果做一些事情,这里将它们转换为字符串,而不是继续得到所指的对象我可以抓住它们之前的名字(名字).
我最近了解了 Perl 捕获组。我想在 C++ 源代码中查找特定的文本行并替换该行中的数值。
我正在寻找的线路如下:
outf << EPS << "\t" << TOL << "\t" << ort << "\t" << bkw << "\t" << gflops << "\t# 99-99" << endl;
Run Code Online (Sandbox Code Playgroud)
我要替换的数值是99-99. 我想用由两个数字组成的类似结构替换它,例如6-8,6-16等等。
我用来查找此特定行和数字结构的正则表达式是:
$txt =~ /outf.*\\t\# (\d+-\d+).*<< endl;/;
Run Code Online (Sandbox Code Playgroud)
数字结构用组正确捕获,并将存储在$1. 的$txt是包含整个C ++文件的源代码的字符串变量。
我改变了正则表达式,试图将匹配的组替换为:
$txt =~ s/outf.*\\t\# (\d+-\d+).*<< endl;/$eb-$mb/;
Run Code Online (Sandbox Code Playgroud)
但它用存储在变量$eb和 中的新数字结构替换了整行$mb。有没有一种优雅的方法来仅替换捕获的组(\d+-\d+)?
更新:反对,法官大人,我反对关闭我的问题。首先,它有一个更清晰的问题和一个最小的工作示例。其次,类似问题提供的答案既不雅观又繁琐。第三,Perl 因能够以多种不同方式解决同一问题而臭名昭著。我相信这里提供的答案更合适和清晰。
我想结合的例子:
sVar=$(whoami)
sVar=${sVar^}
sVar=${sVar::1}
Run Code Online (Sandbox Code Playgroud)
输出:
要求:
我意识到这可以用 tr、sed、awk、printf、cut 等来完成;但这不是问题的重点。
任何帮助表示赞赏!
这不是真正的代码或任何表明我真正想要做什么的东西。我经常默认(或尝试)只使用一个命令而不是连接多个命令。
我看到其他帖子指出在大括号内连接是不可能的,但我知道一切皆有可能。
请不要:
substitution ×13
perl ×7
regex ×6
r ×2
vim ×2
bash ×1
evaluation ×1
hash ×1
names ×1
neovim ×1
parameters ×1
ruby ×1
scope ×1
string ×1
variables ×1