【问题标题】:Shell script to modify variable with file name of multiple files in same directoryShell脚本用同一目录中多个文件的文件名修改变量
【发布时间】:2018-08-12 08:38:31
【问题描述】:

我在一个目录中有多个文件,例如:

a01.txt
a02.txt
a03.txt 
etc...

目录下所有文本文件的第3行如下:

consumer[location].userid= constant

我想在每个文件的第三行用相应的文件名替换“位置”一词,不带扩展名,例如:as

consumer[a01].userid= constant    --------- for a01.txt
consumer[a02].userid= constant    --------- for a03.txt
etc

你能帮忙吗?

【问题讨论】:

  • 我们的目标是在您的问题中添加一些您自己的代码,以至少显示您为解决这个问题所做的研究工作。
  • Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: linux bash shell scripting sh


【解决方案1】:

因此,从顶部开始:您要替换文件特定行中的单词(位置)。 谷歌表示,sed 可以做到这一点:

sed -i "3s/location/foo/" file.ext

将替换文件“file.ext”第三行中第一次出现的“location”

您要替换位置的字符串应该是不带扩展名的文件名。 由于您知道扩展名,因此 basename 应该可以正常工作:

basename /path/to/file.ext .ext

将返回“文件”。

现在循环遍历目录中的所有 txt 文件:

for filename in directory/*.txt; do
# Do stuff
done

将这些命令组合起来会产生如下所示的简短脚本:

#!/bin/bash
# Assumes the script is located in the data directory
for filename in ./*.txt; do
    name=$(basename $filename .txt)
    echo "$filename -> $name"
    sed -i "3s/location/$name/" $filename
done

【讨论】:

  • 您的意思可能是3s/location/foo/(注意s)。您当前的命令是语法错误。
  • 已更正。我还将 -e 替换为 -i,因此它正在更改文件中的行而不是回显它。
  • 你还需要在 "$filename" 周围加上双引号。
  • 脚本可以保存在任何地方,只需要在这些文件所在的目录下运行即可。
  • 感谢您对我的问题的及时和友好的答复。你的剧本正是我需要的,祝你好运。
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
相关资源
最近更新 更多