
如果有“.”,我嘗試在開頭添加 0。在該行的第二個字元處。我無法將這兩者結合;
awk '{ print substr( $0, 2, 1 ) }' file.txt
顯示第二個字符
sed -ie "s/.\{0\}/0/" file.txt
在開頭加一個零。
應該有一個“如果第二個字元是點”。
樣本文件:
1.02.2017 23:40:00
10.02.2017 23:40:00
最終的:
01.02.2017 23:40:00
10.02.2017 23:40:00
答案1
我們可以使用sed
或中的任何一個awk
來徹底解決問題。
和sed
:
$ sed 's/^.\./0&/' file.txt
當&
出現在替換命令 ( s
) 的替換部分時,它將擴展到輸入行中與命令的模式部分相符的部分。
正規表示式的^.\.
意思是“符合所有以 ( ) 開頭的行,^
任意字元 ( .
) 後面接著文字點 (\.
) 的行」。
如果該行是1.02.2017 23:40:00
,則該模式將匹配,並將在該行的開頭1.
替換為。01.
和awk
:
基於awk
問題中的部分程式碼......
如上所述,這將列印每行輸入的第二個字元:
$ awk '{ print substr($0, 2, 1) }' file.txt
我們可以使用返回第二個字元的事實substr($0, 2, 1)
並將其用作條件:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
如果前面的條件為真,則進入的{ ... }
是在 之前新增零的程式碼$0
,也就是目前行的內容:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
然後我們只需要確保列印所有行:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
當然,條件substr($0, 2, 1) == "."
也可以更改為正規表示式(我們使用與sed
解決方案中使用的表達式完全相同的表達式):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
有些認為「越短越好」的人會這樣寫:
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(也可能刪除了大部分空格awk '/^.\./{$0="0"$0}1' file.txt
:)
答案2
使用 sed:
sed -e "/^.\./s/^/0/" file.txt
該模式/^.\./
在 line 開頭查找任何字元和文字點^
,如果匹配,則s
用零替換該行開頭,從而有效地將零添加到開頭。
sed 表達式s/.\{0\}/0/
有點奇怪,它匹配任何內容的零個或多個副本並替換為零。該模式當然會匹配字串的每個位置,但由於s///
僅替換第一個匹配項,因此它會按您的預期工作。不過,這是一種奇怪的方法。
或使用 awk,類似的正規表示式可以符合該行,但我們可以使用substr
:
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
我們首先測試第二個字元是否是點,如果是,則在該行的前面加上一個零。最後一個呼叫在任何修改後列印該行的預設操作。
答案3
您說的是 awk 和 sed,但您似乎正在嘗試格式化日期,為此我將使用該date
命令。例如:
echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d
將輸出
01.02.2017 23:40:00
sed
中間的指令將句點改為斜線以輸入到中date -d
。格式選項允許以幾乎任何您想要的格式輸出。特別是%m
將對月份進行零填充,這似乎是您想要做的。
正如庫薩拉南達所指出的:
更緊湊(GNU date 和 Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
答案4
使用 sed 可能是
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
這將用於^
錨定到行的開頭,然後捕獲群組中的任何單個字符,後跟文字.
,然後是其他任何內容。如果我們匹配,我們列印 a 0
,然後列印我們的第一個捕獲組(行開頭的字元),然後列印 a.
然後我們的第二個捕獲組(行的其餘部分)