我正在尝试解决以下问题。在其他人的大力帮助下,我可以编写和理解 Bash 脚本中的简单 do 循环。
现在我尝试这样做:
在“mein_directory”目录中我需要首先执行以下操作
创建 10 个子目录,名称为 subdirectories1.... subdirectories10
然后我需要将文件复制到每个子目录,
然后我需要进入每个子目录并更改从主目录复制的文件中的特定单词。
这是我目前的主要问题,因为我需要改变一个特定的词实际上是一个数字,我需要将这个数字更改为一个增量乘以子目录的数量
我的代码如下:
#!/bin/bash
increment=10
for i in {1..10}; do
mkdir subdirectory_$i;
done
for d in */; do
cp FILE "$d";
done
for j in {1..10}; do
cd subdirectory_$j/
increment=increment*$j
sed -i 's/old_word old_digit/old_word old_digits+increment/g' CONTROL
cd ../;
done
假设在 subdirectory_1 中的文件“FILE”
我需要更改以下内容
从
Paul 10
到Paul 20
在 subdirectory_2 中
从
Paul 10
到Paul 30
请问有人知道如何解决这个问题吗?
多谢
答案1
假设old_word
标记已知。然后我们可以使用grep
它从原始文件中获取数字:
NUM=$(grep -Po -m1 '(?<=old_word )\d+' FILE)
- 这使用了 Perl 正则表达式。它表示
old_world
应该先于一些数字,但不应被视为实际匹配的一部分。 -o -m1
告诉 grep 仅打印匹配的部分(数字),并且仅打印第一个这样的匹配。
然后你可以将复制与修改结合起来:
for i in {1..10}
do
NEXT_NUM=$((NUM + i*increment))
mkdir subdirectory_$i
sed -r 's/(old_word )'$NUM'/\1'$NEXT_NUM'/' FILE > subdirectory_$i/FILE
done
需要考虑的事项:
sed
算术不是很擅长,所以如果您想在表达式本身内执行此操作,请考虑使用 Perl 或 Awk。- 您不能直接
a=1*2
在 shell 脚本中执行算术运算。您需要将表达式括在$(( ))
:中a=$((1*2))
,或者使用诸如 之类的关键字let
。 - 变量不会在单引号中展开,但是正则表达式经常包含具有特殊含义的字符,因此对表达式使用单引号更安全,并暂时将它们添加到我们的变量中。
- 括号内的符号
(old_word )
表示这是一个子表达式,你可以可以参考稍后使用\1
(如在替换中所见)。