我有一个运行的 bash 脚本,我正在尝试使用 Perl one-liner 来替换文件 variables.php 中的一些文本
但是,我想检查 Perl one-liner 是否成功运行,这就是我挂断电话的地方。我可以只输出 one-liner 并且它可以正常工作,但我想确定它是否运行。
基本上,函数 replace_variables() 是执行更新的函数,我想检查单行是否正常工作的 if 语句。
我试过在那个 if 语句中使用 run_command 函数,但这没有用,我试过将单线直接放在那里,这也不起作用。
如果我不将其包装在 if 语句中,而直接调用单行,则一切都会按预期进行。
这是完整的文件
#!/bin/bash
export CLI_CWD="$PWD"
site_variables() {
if [ -f "$CLI_CWD/variables.php" ]; then
return true
else
return false
fi
}
replace_variables() {
# perl -pi -e 's/(dbuser)(\s+)=\s.*;$/\1 = Config::get("db")["user"];/; s/(dbpass)(\s+)=\s.*;$/\1 = Config::get("db")["pass"];/; s/(dbname)(\s+)=\s.*;$/\1 = Config::get("db")["database"];/' "$CLI_CWD/variables.php"
if [run_command ]; then
echo "Updated variables.php successfully"
else
echo "Did not update variables.php"
fi
}
run_command() { …Run Code Online (Sandbox Code Playgroud) 需要像单行命令、powershell 这样的命令来删除文件夹,我正在尝试找到一种优雅的方法来按反映日期的文件夹名称删除文件夹,但我不能依赖文件/文件夹日期元数据属性。
这是我试图解决的问题:我有一个文件夹,其中有每天的存档通话录音,录音系统创建文件夹并用通话录音填充它们,每天的文件夹名为 format MM_dd_yyyy。我需要删除除最后 7 个文件夹之外的所有文件夹。但是,我不能依赖文件的创建/修改日期。只需使用 powershell 就容易得多。因此,不幸的是,我必须通过根据需要以相同格式保留的文件夹的日期测试文件名来删除文件夹(MM_dd_yyyy)。我可以使用以下 Windows 命令行获取前 6 天要保留的文件夹名称列表:
c:\>powershell $d0=(Get-Date).ToString('MM-dd-yyyy'); $d1=(Get-Date).AddDays(-1).ToString('MM-dd-yyyy'); $d2=(Get-Date).AddDays(-2).ToString('MM-dd-yyyy'); $d3=(Get-Date).AddDays(-3).ToString('MM-dd-yyyy'); $d4=(Get-Date).AddDays(-4).ToString('MM-dd-yyyy'); $d5=(Get-Date).AddDays(-5).ToString('MM-dd-yyyy'); $d6=(Get-Date).AddDays(-6).ToString('MM-dd-yyyy'); $d0; $d1; $d2; $d3; $d4; $d5; $d6
Run Code Online (Sandbox Code Playgroud)
注意:由于公司和域强制执行的安全限制,我需要将其保留在一行命令中,并且无法使用 PS1 power shell 脚本
这会生成要保留的文件夹名称,如下所示(于 2021 年 11 月 20 日运行以保留最后 7 天)。
11_20_2021
11_19_2021
11_18_2021
11_17_2021
11_16_2021
11_15_2021
11_14_2021
Run Code Online (Sandbox Code Playgroud)
目的是删除任何类似 11_13_2021、11_12_2021... 等的文件夹名称。
我可以在 Windows bat 文件中运行嵌套的 FOR 循环来尝试将其组合在一起,但我试图找到一种更简单、可读和优雅的单行代码,它可以让我执行如下操作$d=(Get-Date).AddDays(-7).ToString('MM-dd-yyyy'):然后使用一些神奇的 powershell 工具来删除任何与要保留的文件夹不匹配的文件夹。
如果我有办法(MM_dd_yyyy)向(get-date).AddDays(-6)powershell 命令提供文件夹名称并让它返回布尔值“是”或“否”,那么这将更接近我正在寻找的内容。我一直在阅读,你们在管管子、拔头发,但到目前为止我正在学习,但大部分都把它弄得一团糟。任何想法都是非常受欢迎的。
我可能完全错误地对待这一切。限制条件是:
给定具有命名格式的文件夹列表MM_dd_yyyy,我需要删除/删除不在最近一周内的所有文件夹。
我无法运行 powershell 脚本 .ps1 我可以使用 …
问题:
我知道可以将 if 语句放在一行上,但是有没有办法做到这一点,以便 PEP8 不会将其重新格式化为两行?我知道您可以将其放在两行上,但这并不能回答我关于将其放在一行上的可能性的问题。
尝试:
if date > p1_max_date: p1_max_date = date
Run Code Online (Sandbox Code Playgroud)
除了 PEP8 将其重新格式化为以下事实之外,上述代码仍然有效:
if date > p1_max_date:
p1_max_date = date
Run Code Online (Sandbox Code Playgroud)
我知道我可以在保存时关闭自动格式化功能,但是有没有一种方法可以在一行上实现相同的功能(仅在条件为if真时执行该语句而没有else语句),而无需关闭 PEP8 重新格式化保存功能?
我在想一些类似的事情:
p1_max_date = date if date > p1_max_date
Run Code Online (Sandbox Code Playgroud)
但这给了我一个语法错误:
File "<string>", line 1
p1_max_date = date if date > p1_max_date
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我还尝试使用三元运算符,但以下尝试均无效:
p1_max_date = date if date > p1_max_date else pass
# this doesn't work and gives me a syntax error
Run Code Online (Sandbox Code Playgroud)
p1_max_date = date if date …Run Code Online (Sandbox Code Playgroud) 我有一个班轮:
az account list -o table |perl -lane 'print $F[0] if /GS/i'
Run Code Online (Sandbox Code Playgroud)
我想将默认分隔符从“\t”更改为“-”
有任何提示如何执行此操作吗?
只是想强调一下,我正在寻找的是 oneliner ;)
我希望能够一次性列出一个文件,而不必chmod +x像. 有没有办法一次性做到这一点?以下是一些描述预期行为的伪代码解释:touchtouch foo && chmod +x foo
chmod <placeholder> && touch <placeholder> <-redirect- "filename"
Run Code Online (Sandbox Code Playgroud)
我厌倦了输入一次性命令,然后返回并对不同文件执行几次相同的命令,我必须在每个命令中编辑文件名两次。在我的伪代码示例中,我只需返回到之前输入的命令并仅编辑末尾的文件名字符串。
我努力了,
touch "$(echo foo && chmod +x !$)"
Run Code Online (Sandbox Code Playgroud)
但文件名既不在字符串的末尾,而且它似乎不起作用,因为最后!$一个参数是传递给 before 的命令的参数touch。
我有以下 for 循环:
a = 0
b = 100
for x in my_list:
a = a * b + x
return a
Run Code Online (Sandbox Code Playgroud)
我的问题是我可以单行写吗?
我试过了:
a = my_list[0]
return sum((a*b + x) for x in my_list)
Run Code Online (Sandbox Code Playgroud)
但不是做我想做的。
当涉及到使用 powershell 编写脚本(或者一般来说涉及到脚本编写)时,我还很陌生。我遇到的问题是,我有一堆变量想要在一行中输出。这不是原始的而是简化的代码:
$a = 1
$b = 2
$c = $a; $b;
Write-output $c
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
1
2
Run Code Online (Sandbox Code Playgroud)
您可能会猜到我希望输出的样子:
12
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了解决方案,但似乎没有任何效果。我究竟做错了什么?
我有一个棘手的问题,我想知道是否有一个聪明的正则表达式解决方案。我的输入数据由两列组成,但第一列需要分成多行,第二列保持不变。例如,一个名为 test 的文件:
cat_;_dog_;_rat animal
chair_;_desk object
Run Code Online (Sandbox Code Playgroud)
输出需要如下所示:
cat animal
dog animal
rat animal
chair object
desk object
Run Code Online (Sandbox Code Playgroud)
有任意数量的; 每行上有分隔符。可能有一种方法可以在单行中执行此操作,我更喜欢这种方法,因为我正在通过管道输入和输出数据。我试过这个:
perl -pe 's/(\w+)_;_(\w+)\t(.+)/$1\t$3\n$2\t$3/g' test
Run Code Online (Sandbox Code Playgroud)
第一列包含(\w+)由 分隔的单词_;_,然后是制表符,然后是第二列。但这仅消耗数据的一次迭代:
cat animal
dog_;_rat animal
chair object
desk object
Run Code Online (Sandbox Code Playgroud)
我也尝试了以下方法,以防/g全局标记不正确:
perl -pe 's/(\w+)(_;_(\w+))+\t(.+)/$1\t$4\n$3\t$4/g' test
Run Code Online (Sandbox Code Playgroud)
它仍然只进行一轮。谁有一些想法?
one-liner ×8
perl ×3
bash ×2
powershell ×2
python ×2
arguments ×1
for-loop ×1
if-statement ×1
iteration ×1
newline ×1
python-2.7 ×1
python-3.x ×1
regex ×1