我正在尝试编写一个 find 和 cd 函数,如下所示:
findcd () {
cd "$(dirname "$(find '$1' -type '$2' -name '$3')")"
}
像这样被调用:
find . f [FILE_NAME]
但它看到了美元符号,并期待更多的争论来反对执行里面的内容。我刚刚开始编写别名和函数,所以任何建议都会非常有帮助!
我正在尝试编写一个 find 和 cd 函数,如下所示:
findcd () {
cd "$(dirname "$(find '$1' -type '$2' -name '$3')")"
}
像这样被调用:
find . f [FILE_NAME]
但它看到了美元符号,并期待更多的争论来反对执行里面的内容。我刚刚开始编写别名和函数,所以任何建议都会非常有帮助!
我试图运行下面给出的命令
cat numbers.txt | sort < words.txt
上面的命令有一个从 cat 命令馈送到 sort 命令输入流的管道。但同时,sort命令的输入流也被重定向到words.txt文件。运行命令时,我发现words.txt 中的数据已按排序命令排序并显示回终端中。
我不明白在这种情况下外壳程序如何处理管道和重定向。一个命令是否可以接受来自两个不同源的输入流。我对其内部工作方式的想法是,由于重定向和管道是沿着命令从左到右处理的,因此首先将 cat 命令的输出流作为 sort 命令的输入流。但由于排序命令在该管道之后提供了另一个输入流重定向,因此排序命令的输入流将连接到words.txt。因此,当命令执行时,words.txt 中的数据只会到达排序命令。
另外为什么下面的命令不运行。我已经通过覆盖更改了重定向,通过附加重定向。
cat numbers.txt | sort << words.txt
有一个与此部分类似的问题,但我无法完全理解外壳程序如何处理管道和重定向。
我正在使用下面的脚本,出现语法错误,因为无法从机密管理器获取凭据。“用户名”:“我已输入的访问密钥的 AWS CLI 命令”,“密码”:“我已输入的密钥的 AWS CLI 命令”。如果有人能帮忙就太好了
#!/bin/bash
# Send the POST request and capture the response
response=$(curl -k \
-H "Content-Type: application/json" \
-X POST \
-d \
'{
"username":"'aws secretsmanager get-secret-value --region ap-south-1 --secret-id poc | jq --raw-output '.SecretString' | jq -r '.Access_Key''",
"password":"'aws secretsmanager get-secret-value --region ap-south-1 --secret-id poc | jq --raw-output '.SecretString' | jq -r '.Secret_Key''"
}' \
https://<region>/api/v1/authenticate)
我有一个文件列表:
out_CCGCGGTT+CTAGCGCT_R1.fq.gz
out_TTATAACC+TCGATATC_R2.fq.gz
out_GGACTTGG+CGTCTGCG_R1.fq.gz
out_AAGTCCAA+TACTCATA_R2.fq.gz
...
适配器 ID(两个下划线之间,如 AACGTTCC+AGTACTCC、AACGTTCC+AGTACTCC)与 ID.file.txt 的第一列匹配
head ID.file.txt:
CCGCGGTT+CTAGCGCT NHL_332_N
TTATAACC+TCGATATC NHL_333_T
GGACTTGG+CGTCTGCG NHL_334_T
AAGTCCAA+TACTCATA NHL_335_T
ATCCACTG+ACGCACCT NHL_336_N
GCTTGTCA+GTATGTTC NHL_337_N
CAAGCTAG+CGCTATGT NHL_338_N
TGGATCGA+TATCGCAC NHL_339_T
...
我想重命名这些文件,并将适配器 ID 替换为真实 ID(ID 文件的第二列)(如果它们匹配),并从开头删除“out”。
所以我的最终文件名,例如:
NHL_332_N_R1.fq.gz
NHL_333_T_R2.fq.gz
NHL_334_T_R1.fq.gz
NHL_335_T_R2.fq.gz
有什么办法可以在bash中做到这一点吗?
祝你有美好的一天,我有文本文件(zz.txt):
Chemical name
3-Aminopropane-1-sulphonic acid
Synonym(s)
--
Homotaurine * Tramiprosate
--
Chemical name
Common name and synonyms
...
我有变量 s="Homotoaurine * Tramiprosate"; 我尝试从文本文件中(取消)选择该变量的文本:
s="Homotaurine * Tramiprosate"; cat zz.txt | grep -i "$s"
s="Homotaurine * Tramiprosate";cat zz.txt | sed -ne "/$s/p"
不起作用。但是,如果我将 $s 更改为“化学名称”,则一切正常,grep 和 sed 可以正确且类似地工作。从另一个文本文件接收变量 $s。下次它可以包含或不包含星号。是的,我意识到星号是非常特殊的字符。如何使用 sed/grep 解决我的任务?还有一个问题——其他哪些类似的角色可能会让人头疼?
我想知道是否可以重用通配符路径中匹配的任何内容?(就像通常可以通过正则表达式替换来完成一样?)
我知道以下示例还有其他解决方案,但我只是将其用作我所要求的示例:假设file_1.txt, file_2.txt, ..., file_100.txt
当前文件夹中有文件,我想将它们重命名为asdf_1_qwer.txt
, asdf_2_qwer.txt, ..., asdf_100_qwer.txt
. 当然,我可以将它们与 匹配file_*.txt
,但是我可以以某种方式重用匹配的任何内容*
来指定目标文件名吗?
我不明白这个变量的行为:
SSH_CONFIG_FILE="~/.ssh/config"
echo $SSH_CONFIG_FILE
ls -l $SSH_CONFIG_FILE
ls -l ~/.ssh/config
这是输出:
~/.ssh/config
ls: cannot access '~/.ssh/config': No such file or directory
-rw------- 1 pm domain^users 1229 Sep 19 10:52 /home/pm/.ssh/config
为什么echo
使用 $ 符号可以工作,但ls
不行?
我尝试用“”、''、``、{}、[] 包围变量,但没有任何改进。
我需要帮助使用 grep 从 Linux 系统上的文件中提取分区日期时间。
源文件是一个 XML,包含以下数据:
<item start="20231010073000 +0100" stop="20231010100000 +0100">...</item>
我需要提取完整的开始日期,但使用 grep 我无法得到完整的结果。我的代码:
for startDate in $(grep -Eo 'start="[0-9]{14} [\+|\-][0-9]{4}"' "$filepath" ); do
echo "$startDate"
done
我得到了两个不同的结果:
start="20231010073000
+0100"
我可以得到它如下:
start="20231010073000 +0100"
我尝试过 \s、[[:space:]] 和其他示例,但解决方案相同。
我的代码似乎有错误,但我无法修复它!
我很感谢任何形式的帮助!
我有一个 .vcf.gz 文件,具有以下方面:
#CHROM POS ID REF ALT
chr1 10894 chr1:10894:G:A G A
chr1 10915 chr1:10915:G:A G A
chr1 10930 chr1:10930:G:A G A
我想修改 CHROM 列以删除“chr”并将其替换为任何内容,因此我希望得到如下结果:
#CHROM POS ID REF ALT
1 10894 chr1:10894:G:A G A
1 10915 chr1:10915:G:A G A
1 10930 chr1:10930:G:A G A
因此,我编写了以下命令行:
zcat input.vcf.gz | sed 's/^chr//' > output.vcf.gz
它起作用了。问题是我想将输出文件保存为压缩文件,扩展名为 vcf.gz。即使我写了“output.vcf.gz”,输出文件也不会被压缩。
如何修改压缩文件然后再次将其另存为压缩文件?
非常感谢!
我尝试为 macOS 制作一个脚本来通知我可用的软件更新:
result=$(softwareupdate -l)
if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi
但重要的一行不包括在内。结果:
result=$(softwareupdate -l)
softwareupdate -l
++ softwareupdate -l
No new software available.
+ result='Software Update Tool
Finding available software'
if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi
echo $result
++ echo Software Update Tool Finding available software
+ [[ Software Update Tool Finding available software = *\N\o\ \n\e\w\ \s\o\f\t\w\a\r\e\ \a\v\a\i\l\a\b\l\e\.* ]]
该行:“没有可用的新软件。” 不包含在变量中。为什么?