在所有文件中替换一个特定的文本与文本从自己的文件名在Linux

knsnq2tg  于 2024-01-06  发布在  Linux
关注(0)|答案(3)|浏览(166)

日安!
我在Ubuntu中有这样的文件:

  • ZAF_MM_CYCLE_K051.XLS
  • ZAF_MM_CYCLE_K052.XLS
  • ZAF_MM_CYCLE_K053.XLS

是文件“ZAF_MM_CYCLE_K036”的副本,文件代码为K 036
文件内容相同

  1. LOADED_AGRS ZAF_MM_CYCLE_K036
  2. AGG_DEFINE 200ZAF_MM_CYCLE_K036 $WERKS K036
  3. AGG_1521 200ZAF_MM_CYCLE_K036

字符串
这里我必须根据文件名用它自己的代码替换代码
例如:
文件:ZAF_MM_CYCLE_K051.XLS
它代码是K 051,我必须将K 036替换为K 051,因此文件的内容将是:

  1. LOADED_AGRS ZAF_MM_CYCLE_K051
  2. AGG_DEFINE 200ZAF_MM_CYCLE_K051 $WERKS K051
  3. AGG_1521 200ZAF_MM_CYCLE_K051


有人能帮帮忙吗?

qncylg1j

qncylg1j1#

如果所有文件都包含K 036,下面的脚本将帮助您。

  1. #!/bin/bash
  2. directory="/path/to/file"
  3. cd "$directory"
  4. for file in ZAF_MM_CYCLE_K*.xls; do
  5. code=$(echo "$file" | cut -d'_' -f4 | cut -d'.' -f1)
  6. sed -i "s/K036/$code/g" "$file"
  7. echo "Code replaced in $file"
  8. done

字符串
其中
回显“$file”|cut -d'_' -f4| cut -d'.' -f1
将从文件名中提取文件名k 051
sed -i“s/K036/$code/g”“$file”
将用新值替换旧值
所以这对你的案子有帮助。

展开查看全部
t5fffqht

t5fffqht2#

正如罗恩在评论中提到的,你可以用bash来做这样的事情,以生成具有与索引匹配的修改内容的文件:

  1. # Iterate over the values from 036 to 051
  2. for i in {036..051}; do
  3. echo "Generating 'ZAF_MM_CYCLE_K${i}.XLS'"
  4. cat > ZAF_MM_CYCLE_K${i}.XLS << EOL
  5. LOADED_AGRS ZAF_MM_CYCLE_K${i}
  6. AGG_DEFINE 200ZAF_MM_CYCLE_K${i} $WERKS K${i}
  7. AGG_1521 200ZAF_MM_CYCLE_K${i}
  8. EOL
  9. done

字符串
上面将生成当前目录中描述的文件。cat > ZAF_MM_CYCLE_K${i}.XLS << EOL使用heredoc生成文件。文件名和内容使用$i变量作为名称。随着for循环的执行,i递增,即036037038,. 051等,用于相应地生成文件名和内容。
如果你想使用类似sed的东西来替换内容。在文件所在的目录中运行以下命令应该可以做到:

  1. # Iterate over the files and replace contents
  2. for f in ZAF_MM_CYCLE_K0{36..51}.XLS; do
  3. # Set a variable the same as the filename but strip off ZAF_MM_CYCLE_K
  4. n=${f//ZAF_MM_CYCLE_K/}
  5. # Further strip off the file extension
  6. n=${n%*.XLS}
  7. echo "Replacing K036 in $f with ${n}"
  8. # Replace the contents with the number found in the file name
  9. sed -i "s|K036|${n}|g" "$f"
  10. done


基本上,我们对每个文件进行重新命名,通过使用bash参数扩展剥离ZAF_MM_CYCLE_K.XLS来设置一个变量名,该变量名包含文件名中的数字。一旦推导出数字,使用sed替换给定文件上的内容。sed -i在原始文件上进行就地替换。
希望这对你有帮助!

展开查看全部
35g0bw71

35g0bw713#

这可能对你有用(GNU sed & parallel):

  1. parallel sed -i \''s/K036/{=s/.*_(.*)\.XLS$/\1/=}/g'\' {} ::: *.XLS

字符串
为当前目录中以.XLS结尾的每个文件构建并执行单独的sed脚本。
sed脚本将用文件名中最后一个_之后的代码替换K036,并在最后一个.之前结束。

相关问题