Perl一行程序配方:将列表转换为';单引号中逗号分隔的字符串';或';多行';在飞行中 问:如何快速方便地转换列表,以便进一步处理?

Perl一行程序配方:将列表转换为';单引号中逗号分隔的字符串';或';多行';在飞行中 问:如何快速方便地转换列表,以便进一步处理?,perl,readline,Perl,Readline,重点是一种通用方法,以实现完全流畅的工作流(无需处理文件、管道、切割和过去等麻烦),以便进一步处理 Q1)将列表转换为单引号中逗号分隔的字符串 主要需要在数据库中插入值,如MySQL、MariaDB、Oracle等 将abc转换为'A','B','C' 问题2:如何使用ID将ID列表转换为命令列表 由于IOS命令行上缺少shell功能(如用于循环或XARG),主要需要重复一个命令(比如多个进程号),以便终止Cisco路由器上的多个isakmp会话(VPN)。

重点是一种通用方法,以实现完全流畅的工作流(无需处理文件、管道、切割和过去等麻烦),以便进一步处理

Q1)将列表转换为单引号中逗号分隔的字符串 主要需要在数据库中插入值,如MySQL、MariaDB、Oracle等

abc
转换为
'A','B','C'

问题2:如何使用ID将ID列表转换为命令列表 由于IOS命令行上缺少shell功能(如用于循环或XARG),主要需要重复一个命令(比如多个进程号),以便终止Cisco路由器上的多个isakmp会话(VPN)。
23828 11281 22873 3765 1234
转换为

clear crypto isakmp 23828
clear crypto isakmp 22873
clear crypto isakmp 11281
clear crypto isakmp 22873
clear crypto isakmp  3765
clear crypto isakmp  1234
关于这个问题的主要焦点的补充 我完全了解SQL注入攻击的风险。但安全性不是重点,因为我知道我的列表中包含的数据类型。主要重点是采用一种更通用的方法来动态转换列表,同时尽可能灵活。当然,使用适当的工具,如sed、awk、tr、cut或其他工具,可以更好地完成某些任务。不幸的是,每次为特定任务选择最好的工具时,您都必须摆弄语法,切换工具的工作方式。这正是我想要避免的麻烦,因为我手头有一个更通用的方法

因此,请记住这个主题:只需按下一个按键即可调用Perl one liner,该按键在执行之前可以在shell中轻松调整/编辑。我的方法——我自己看答案,作为一个侧节点——正好满足了这个要求。
所以,在发布问题的解决方案或建议之前阅读我的答案可能是个好主意。;-)

使用一个简短的perl one liner即可快速轻松地完成这两项工作

A1:用逗号分隔的字符串在单引号中构建一个字符串(即一行) 首先创建要在以下(SQL)示例中使用的列表:

cat > list.txt <<EOF
A
B
C
D
EOF
perl -le 'print foreach (1000..1010)' | pbcopy
创建带有单引号字符串的逗号分隔列表:

cat > list.txt <<EOF
A
B
C
D
EOF
perl -le 'print foreach (1000..1010)' | pbcopy
为了避免bash对单引号的解释出现问题,请对单引号使用两位十六进制ASCII值\x27

perl -e 'print join ",", map { chomp; qq(\x27$_\x27) } <>' list.txt     # 'A','B','C','D'
甚至更短;使用
pbcopy
动态地用转换后的列表替换剪贴板的内容:

 pbpaste | perl -e 'print join ",", map { chomp; qq(\x27$_\x27) } <>' | pbcopy
现在只需点击ctrl+x+c即可实现SQL插入值的全自动转换

为了完整起见,一些关于SQL引用的注释

:单引号应用于字符串值,如values()列表中的字符串值。MySQL对字符串值也支持双引号,但其他RDBMS更广泛地接受单引号,因此使用单引号而不是双引号是一个好习惯

A2:从列表(如过程编号)创建命令列表(即多行) 与A1不同,这种方法构建多行(使用进程ID重复命令)

再次:首先创建一个列表,用于以下(Cisco)示例:

cat > list.txt <<EOF
A
B
C
D
EOF
perl -le 'print foreach (1000..1010)' | pbcopy
实际上,将真实进程ID复制到剪贴板;之后,将普通的数字列表转换为相应的命令列表:

pbpaste | perl -wle 'while (<>) {chomp; print "clear crypto isakmp $_"}'
若要在需要时将它也放在手边(例如,按ctrl+x+p键查看流程列表),只需将这一行写入$HOME/.inputrc即可

"\C-xc": "pbpaste | perl -e 'print join ",", map { chomp; qq(\x27$_\x27) } <>' | pbcopy"
"\C-xc": "pbpaste | perl -wle 'while (<>) {chomp; print "clear crypto isakmp $_"}' | pbcopy"
“\C-xc”:“pbpaste | perl-wle”while(){chomp;print“clear crypto isakmp$”}“pbcopy”

问题表明我们没有使用剪切粘贴等,因此我假设我们正在获取列表项并在Perl脚本中处理它们

Q1提出了一种非常危险的插入SQL的方法。如果单个列表项恰好包含Perl不考虑特殊但SQL确实如此的字符,那么您将数据库打开到.

您不应该在Perl中组合列表,而应该为DBI层创建一个参数,然后直接将列表项作为参数传递

当作为SQL处理时,可以正确地清理列表元素以避免误解,但使用prepared语句方法不太可能导致安全漏洞

第二季度也是如此。虽然可以轻松检查进程id号,但在一般情况下,最好直接传递参数,例如使用Perl的多参数形式exec()或system()。

Q1)有两种方法

$ echo "A B C" | perl -lpe ' s/(\S+)/\x27$1\x27/g ; s/\s+/,/g '
'A','B','C'

$ echo "A B C" | perl -ne ' @x=split(/\s+/); $_="\x27$_\x27" for(@x); print join(",",@x) '
'A','B','C'
问题2)


您说您的第一个需求是“主要需要在数据库中插入值”。您提出的解决方案是开放的,应该避免

为避免此问题,在将外部数据插入数据库时,应始终使用绑定点。大概是这样的:

open my $fh, '<', 'somefile.txt' or die $!;

chomp(my @data = <$fh>);

my $sql = 'INSERT INTO some_table VALUES (';
$sql .= join ',', ('?') x @data;
$sql .= ')';

# Assume you already have a $dbh
my $sth = $dbh->prepare($sql);
$sth->execute(@data);

打开我的$fh,'你的问题应该进入这个问题,你的答案进入这个问题的答案,然后你接受。我在这里看不到任何问题。你尝试了什么?你有什么问题?请把你的代码展示给我们。@斯蒂芬贝克In Pito Prime:根据你的建议分成问题/回答部分。@ DaveCross认为这篇文章,而不是我自己回答的问题,正如这里所说的:在X上的Linux,你有我的代码> XCclipse 。或者使用perl/Tk,执行如下操作:
使用Tk;打印主窗口->新建->选择获取(-selection=>“剪贴板”)
使用Tk;打印主窗口->新建->选择获取上面的解决方案是向数据库插入值的一种常见做法。但是主题是要有一个通用的方法来转换列表w
$ echo "A B C" | perl -lpe ' s/(\S+)/\x27$1\x27/g ; s/\s+/,/g '
'A','B','C'

$ echo "A B C" | perl -ne ' @x=split(/\s+/); $_="\x27$_\x27" for(@x); print join(",",@x) '
'A','B','C'
$ echo "23828 11281 22873 3765 1234" | perl -lane ' print "clear crypto isakmp $_" for(@F) '
clear crypto isakmp 23828
clear crypto isakmp 11281
clear crypto isakmp 22873
clear crypto isakmp 3765
clear crypto isakmp 1234

$
open my $fh, '<', 'somefile.txt' or die $!;

chomp(my @data = <$fh>);

my $sql = 'INSERT INTO some_table VALUES (';
$sql .= join ',', ('?') x @data;
$sql .= ')';

# Assume you already have a $dbh
my $sth = $dbh->prepare($sql);
$sth->execute(@data);