【问题标题】:Swap characters in a string using shell script使用 shell 脚本交换字符串中的字符
【发布时间】:2019-02-09 17:12:41
【问题描述】:

我需要交换一个字符串的字符(它是 mmddyyyy 格式)并在 yyyymmdd 中重新排列它们。此字符串是从文件名 (abc_def_08032011.txt) 中获取的。

string=$(ls abc_def_08032011.txt | awk '{print substr($0,9,8)}')

例如:

  • 当前字符串:08032011(不一定是当前日期)
  • 所需字符串:20110803

我尝试了拆分功能,但它不起作用,因为字符串没有任何分隔符。

非常感谢任何想法/建议。

【问题讨论】:

  • bash、tcsh 或任何其他 shell?

标签: shell


【解决方案1】:

echo 08032011 | sed 's/\(....\)\(....\)/\2\1/'

echo 08032011 | perl -pe 's/(....)(....)/$2$1/'

【讨论】:

  • @pinhead:我花了一点时间才意识到那是您的用户名。 8-)} 请注意,它非常不灵活。还有许多其他可能性,例如搜索数字序列。但是,如果您确定输入的样子并且不需要错误检查,那很好。
  • 输入将几乎保持相同的格式,因此我们不必担心错误检查。我对使用 sed 还是很陌生,如果您能解释一下扩展正则表达式在您给定的解决方案中是如何工作的,那真的很有帮助吗?谢谢。
【解决方案2】:

为什么不一直使用awk:

echo abc_def_08032011.txt | awk '{print substr($0,13,4) substr($0,9,4)}'

或一路sed,避免一个awk:

echo abc_def_08032011.txt | sed 's/^........\(....\)\(....\).*$/\2\1/'

或一直使用 ksh 替换以避免产生 awk/sed 进程:

s=abc_def_08032011.txt
s1="${s#????????}"
s2="${s1%.*}"
echo "${s2#????}${s2%????}"

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多