shell脚本中的SPRINTF?

发布于 2024-10-07 02:26:51 字数 263 浏览 2 评论 0原文

我每天都有一个自动生成的文件,由 shell 脚本调用。 但是,我面临的问题是自动生成的文件具有以下形式:

FILE_MM_DD.dat

... 其中 MM 和 DD 是 2 位数的月份和日期字符串。

我做了一些研究并自己进行了研究,但我不知道如何仅使用 shell 脚本创建这些自定义字符串。

需要明确的是,我知道 Bash 中的 DATE 函数,但我正在寻找与 C 中的 SPRINTF 函数等效的函数。

I have an auto-generated file each day that gets called by a shell script.
But, the problem I'm facing is that the auto-generated file has a form of:

FILE_MM_DD.dat

... where MM and DD are 2-digit month and day-of-the-month strings.

I did some research and banged it at on my own, but I don't know how to create these custom strings using only shell scripting.

To be clear, I am aware of the DATE function in Bash, but what I'm looking for is the equivalent of the SPRINTF function in C.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

流年里的时光 2024-10-14 02:26:51

在 Bash 中:

var=$(printf 'FILE=_%s_%s.dat' "$val1" "$val2")

或者,等效的,更接近于 sprintf

printf -v var 'FILE=_%s_%s.dat' "$val1" "$val2"

如果变量包含带前导零的十进制值,则可以删除前导零:

val1=008; val2=02
var=$(printf 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2)))

printf -v var 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2))

$((10#$val1) ) 将值强制转换为基数 10,因此格式规范中的 %d 不会认为“08”是无效的八进制值。

如果您使用 date(至少对于 GNU date),您可以省略前导零,如下所示:

date '+FILE_%-m_%-d.dat'

为了完整起见,如果您想要添加 em> 前导零,填充到一定宽度:

val1=8; val2=2
printf -v var 'FILE=_%04d_%06d.dat' "$val1" "$val2"

或使用动态宽度:

val1=8; val2=2
width1=4; width2=6
printf -v var 'FILE=_%0*d_%0*d.dat' "$width1" "$val1" "$width2" "$val2"

添加前导零对于创建易于排序并在列中整齐对齐的值很有用。

In Bash:

var=$(printf 'FILE=_%s_%s.dat' "$val1" "$val2")

or, the equivalent, and closer to sprintf:

printf -v var 'FILE=_%s_%s.dat' "$val1" "$val2"

If your variables contain decimal values with leading zeros, you can remove the leading zeros:

val1=008; val2=02
var=$(printf 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2)))

or

printf -v var 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2))

The $((10#$val1)) coerces the value into base 10 so the %d in the format specification doesn't think that "08" is an invalid octal value.

If you're using date (at least for GNU date), you can omit the leading zeros like this:

date '+FILE_%-m_%-d.dat'

For completeness, if you want to add leading zeros, padded to a certain width:

val1=8; val2=2
printf -v var 'FILE=_%04d_%06d.dat' "$val1" "$val2"

or with dynamic widths:

val1=8; val2=2
width1=4; width2=6
printf -v var 'FILE=_%0*d_%0*d.dat' "$width1" "$val1" "$width2" "$val2"

Adding leading zeros is useful for creating values that sort easily and align neatly in columns.

木緿 2024-10-14 02:26:51

为什么不使用 coreutils 中的 printf 程序?

$ printf "FILE_%02d_%02d.dat" 1 2
FILE_01_02.dat

Why not using the printf program from coreutils?

$ printf "FILE_%02d_%02d.dat" 1 2
FILE_01_02.dat
看轻我的陪伴 2024-10-14 02:26:51

尝试:

sprintf() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; }

示例:

$ echo bar | sprintf "foo %s"
foo bar

Try:

sprintf() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; }

Example:

$ echo bar | sprintf "foo %s"
foo bar
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文