如何用sed改变awk变量

时间:2016-10-30 23:17:48

标签: bash shell awk sed scripting

我有一个bash命令,它生成一个我需要更改文件名的文件列表。 所以我想用这样的东西:

GetProgress

问题是应该改变第二个$ 1,用sed取代一些正则表达式。 如何将sed应用于第二个参数?

我尝试使用$()和|,但它不起作用。

我也试过

mycommand | awk {mv $1 altered$1}

3 个答案:

答案 0 :(得分:1)

mv不是awk命令。你需要shell。尝试:

mycommand | while IFS= read -r f; do mv "$f" "${f//[^A-Za-z0-9._-]/_}"; done

这假设文件名是换行符分隔的。除非文件名包含换行符作为其名称的一部分,否则这是正常的。为了获得更好的可靠性,应修改mycommand和while循环以使用NUL作为分隔符。

工作原理:

  • while IFS= read -r f; do

    这会启动一个循环,依次将每一行读入变量f

    IFS=告诉shell将前导空格或尾随空格保留在一行上。如果mycommand产生多余的前导或尾随空格,则删除它。

    -r告诉shell在输入中保留反斜杠。

  • mv "$f" "${f//[^A-Za-z0-9._-]/_}"

    这会重命名文件。

  • done

    这表示while循环结束。

答案 1 :(得分:1)

您接受子shell吗?如果是,可以采用以下简单方法:

mv `mycommand | awk '{print $1}'` {altered$1}

答案 2 :(得分:0)

使用rename(始终安装在基于 Debian 的发行版中,通过必需的 util-linux 包):

rename 's/^/altered/' $(mycommand)